From 0ee4c3136c59871e09452eb93f97d7cb15a1d351 Mon Sep 17 00:00:00 2001 From: Ghanshyam Singh Date: Sat, 14 Mar 2026 21:51:54 +0530 Subject: [PATCH 1/4] update: frontend and RAG pipeline --- .env.example | 6 + .gitignore | 7 + Prockfile | 1 + README.md | 193 +++++++++++++- app/__init__.py | 0 app/pipeline.py | 124 +++++++++ app/server.py | 83 ++++++ app/static/app.js | 151 +++++++++++ app/static/images/logo.png | Bin 0 -> 4048 bytes app/static/style.css | 513 +++++++++++++++++++++++++++++++++++++ app/templates/index.html | 155 +++++++++++ requirements.txt | 12 + 12 files changed, 1243 insertions(+), 2 deletions(-) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Prockfile create mode 100644 app/__init__.py create mode 100644 app/pipeline.py create mode 100644 app/server.py create mode 100644 app/static/app.js create mode 100755 app/static/images/logo.png create mode 100644 app/static/style.css create mode 100644 app/templates/index.html create mode 100644 requirements.txt diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c9a19e8 --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +GEMINI_API_KEY=your_gemini_api_key_here +CHUNK_SIZE=1000 +CHUNK_OVERLAP=200 +TOP_K_RESULTS=5 +EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +LLM_MODEL=gemini-2.5-flash-lite \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1851748 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +venv/ +.venv/ +__pycache__/ +*.pyc +.env +temp/ +chroma_db/ \ No newline at end of file diff --git a/Prockfile b/Prockfile new file mode 100644 index 0000000..934c985 --- /dev/null +++ b/Prockfile @@ -0,0 +1 @@ +web: gunicorn -b 0.0.0.0:$PORT app.server:app \ No newline at end of file diff --git a/README.md b/README.md index 04caa50..533b2b8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,191 @@ -# scholarai -AI-powered research assistant designed to help students and scientists navigate large volumes of academic literature. Supports paper discovery, summarization, citation exploration, and question answering across research papers. Helps organize knowledge, identify trends, and accelerate literature review workflows. +# ScholarAI +Open-source AI-powered research assistant designed to help students and scientists navigate large volumes of academic literature. Supports paper discovery, summarization, citation exploration, and question answering across research papers. Helps organize knowledge, identify trends, and accelerate literature review workflows. + +--- + +## โœจ Features + +- PDF upload and indexing +- Retrieval-augmented question answering (RAG) +- Per-user data isolation (`user_id`) +- Local vector store with ChromaDB +- Simple web UI (HTML/CSS/JS) +- API-first backend (Flask) + +--- + +## ๐Ÿงฑ Tech Stack + +- **Frontend:** HTML, CSS, JavaScript +- **Backend:** Flask (Python) +- **RAG:** LangChain + ChromaDB (local) +- **LLM:** Google Gemini + +--- + +## ๐Ÿ“ Project Structure + +```text +app/ + server.py # Flask API + web routes + pipeline.py # Indexing + QA logic + templates/ + index.html # UI + static/ + style.css + app.js +temp/ # Temporary uploaded files +``` + +--- + +## ๐Ÿš€ Quick Start (Linux) + +### 1) Clone and create virtual environment + +```bash +git clone https://github.com/alphaonelabs/Alpha-one-labs-AI-research-assisstant.git +cd Alpha-one-labs-AI-research-assisstant +python3 -m venv venv +source venv/bin/activate +``` + +### 2) Install dependencies + +```bash +pip install -r requirements.txt +``` + +### 3) Configure environment variables + +```bash +cp .env.example .env +``` + +Set in `.env`: + +```env +GEMINI_API_KEY=your_key_here +``` + +### 4) Run locally + +```bash +python -m app.server +``` + +If module run does not work in your setup: + +```bash +python app/server.py +``` + +Open: `http://127.0.0.1:5000` + +--- + +## ๐Ÿ”Œ API Endpoints + +| Method | Endpoint | Description | +|---|---|---| +| `GET` | `/api/health` | Health check | +| `POST` | `/api/upload` | Upload + index PDF | +| `POST` | `/api/ask` | Ask a question | +| `DELETE` | `/api/user/` | Delete user indexed data | + +### `POST /api/upload` + +- Content-Type: `multipart/form-data` +- Fields: + - `pdf` (file) + - `user_id` (string) + +### `POST /api/ask` + +```json +{ + "question": "What is the main contribution?", + "user_id": "user_abc123" +} +``` + +--- + +## ๐Ÿงช Basic cURL Examples + +```bash +curl -X GET http://127.0.0.1:5000/api/health +``` + +```bash +curl -X POST http://127.0.0.1:5000/api/upload \ + -F "pdf=@/path/to/paper.pdf" \ + -F "user_id=user_demo" +``` + +```bash +curl -X POST http://127.0.0.1:5000/api/ask \ + -H "Content-Type: application/json" \ + -d '{"question":"Summarize section 2","user_id":"user_demo"}' +``` + +```bash +curl -X DELETE http://127.0.0.1:5000/api/user/user_demo +``` + +--- + +## ๐Ÿค Contributing + +We welcome contributions from the community. + +1. Fork the repository +2. Create a feature branch + `git checkout -b feat/your-change` +3. Commit with clear messages +4. Open a Pull Request with: + - Problem statement + - What changed + - Screenshots/logs (if UI or behavior changed) + +Please open an issue first for large changes. + +--- + +## โœ… PR Checklist + +- [ ] Code runs locally +- [ ] Lint/tests pass +- [ ] No hardcoded secrets +- [ ] API/UI changes documented +- [ ] Small, focused PR + +--- + +## ๐Ÿ›  Troubleshooting + +- **Upload returns 404:** frontend must call `POST /api/upload` (not `/upload`). +- **Upload says invalid file:** request field name must be `pdf` (not `file`). +- **Ask fails:** ensure `user_id` and `question` are both sent. +- **No model response:** verify `GEMINI_API_KEY` is set correctly. + +--- + +## ๐Ÿ” Security + +- Do not commit `.env` or API keys. +- Rotate keys if exposed. +- Use `DELETE /api/user/` to remove user data. + +--- + +## ๐Ÿ“„ License + +See [LICENSE](LICENSE). + +--- + +## ๐Ÿ™Œ Maintained by + +**Alpha One Labs** +Open-source AI tooling for practical research workflows. \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/pipeline.py b/app/pipeline.py new file mode 100644 index 0000000..51ea7a2 --- /dev/null +++ b/app/pipeline.py @@ -0,0 +1,124 @@ +import os +from pathlib import Path +from dotenv import load_dotenv + +from langchain_community.document_loaders import PyPDFLoader +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain_huggingface import HuggingFaceEmbeddings +from langchain_chroma import Chroma +from langchain_google_genai import ChatGoogleGenerativeAI +try: + from langchain_classic.chains import RetrievalQA +except Exception: + from langchain.chains import RetrievalQA + +try: + from langchain_core.prompts import PromptTemplate +except Exception: + from langchain.prompts import PromptTemplate + +load_dotenv() + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +CHROMA_DIR = PROJECT_ROOT / "chroma_db" +CHROMA_DIR.mkdir(exist_ok=True) + +CHUNK_SIZE = int(os.getenv("CHUNK_SIZE", "1000")) +CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", "200")) +TOP_K_RESULTS = int(os.getenv("TOP_K_RESULTS", "5")) + +EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL", "sentence-transformers/all-MiniLM-L6-v2") +LLM_MODEL = os.getenv("LLM_MODEL", "gemini-2.5-flash-lite") +GEMINI_API_KEY = os.getenv("GEMINI_API_KEY", "") + +_embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL) +_llm = None + + +def _get_vectorstore() -> Chroma: + return Chroma( + collection_name="scholarai_docs", + embedding_function=_embeddings, + persist_directory=str(CHROMA_DIR), + ) + + +def _get_llm() -> ChatGoogleGenerativeAI: + global _llm + if not GEMINI_API_KEY: + raise RuntimeError("GEMINI_API_KEY is missing. Add it in .env") + if _llm is None: + _llm = ChatGoogleGenerativeAI( + model=LLM_MODEL, + google_api_key=GEMINI_API_KEY, + temperature=0.2, + ) + return _llm + + +def index_document(pdf_path: str, user_id: str) -> dict: + if not user_id: + raise ValueError("user_id is required") + if not Path(pdf_path).exists(): + raise FileNotFoundError(f"PDF not found: {pdf_path}") + + loader = PyPDFLoader(pdf_path) + docs = loader.load() + + splitter = RecursiveCharacterTextSplitter( + chunk_size=CHUNK_SIZE, + chunk_overlap=CHUNK_OVERLAP, + ) + chunks = splitter.split_documents(docs) + + for i, chunk in enumerate(chunks): + chunk.metadata["user_id"] = user_id + chunk.metadata["chunk_index"] = i + + vs = _get_vectorstore() + vs.add_documents(chunks) + + return {"chunks_indexed": len(chunks)} + + +def ask_question(question: str, user_id: str) -> str: + if not question.strip(): + raise ValueError("question is required") + if not user_id: + raise ValueError("user_id is required") + + retriever = _get_vectorstore().as_retriever( + search_kwargs={"k": TOP_K_RESULTS, "filter": {"user_id": user_id}} + ) + + prompt = PromptTemplate( + input_variables=["context", "question"], + template=( + "You are ScholarAI, a research assistant.\n" + "Answer only from the context below.\n" + "If answer is not in context, say: " + "'I could not find this in the uploaded documents.'\n\n" + "Context:\n{context}\n\n" + "Question: {question}\n" + "Answer:" + ), + ) + + qa = RetrievalQA.from_chain_type( + llm=_get_llm(), + chain_type="stuff", + retriever=retriever, + chain_type_kwargs={"prompt": prompt}, + return_source_documents=False, + ) + + result = qa.invoke({"query": question}) + return result["result"] + + +def delete_user_data(user_id: str) -> dict: + if not user_id: + raise ValueError("user_id is required") + vs = _get_vectorstore() + vs._collection.delete(where={"user_id": user_id}) + return {"deleted": True, "user_id": user_id} \ No newline at end of file diff --git a/app/server.py b/app/server.py new file mode 100644 index 0000000..9f5b510 --- /dev/null +++ b/app/server.py @@ -0,0 +1,83 @@ +import os +import uuid +from pathlib import Path + +from flask import Flask, jsonify, render_template, request +from werkzeug.utils import secure_filename + +try: + from app.pipeline import index_document, ask_question, delete_user_data +except Exception: + from pipeline import index_document, ask_question, delete_user_data + +BASE_DIR = Path(__file__).resolve().parent +TEMP_DIR = BASE_DIR.parent / "temp" +TEMP_DIR.mkdir(exist_ok=True) + +app = Flask( + __name__, + template_folder=str(BASE_DIR / "templates"), + static_folder=str(BASE_DIR / "static"), +) + + +@app.get("/") +def home(): + return render_template("index.html") + + +@app.get("/api/health") +def health(): + return jsonify({"ok": True, "service": "scholarai-mvp"}) + + +@app.post("/api/upload") +def upload_pdf(): + pdf = request.files.get("pdf") + user_id = request.form.get("user_id", "").strip() + + if not user_id: + return jsonify({"ok": False, "error": "user_id is required"}), 400 + if not pdf or not pdf.filename.lower().endswith(".pdf"): + return jsonify({"ok": False, "error": "Valid PDF file is required"}), 400 + + temp_file = TEMP_DIR / f"{uuid.uuid4()}_{secure_filename(pdf.filename)}" + pdf.save(temp_file) + + try: + meta = index_document(str(temp_file), user_id=user_id) + return jsonify({"ok": True, "message": "PDF indexed", **meta}) + except Exception as e: + return jsonify({"ok": False, "error": str(e)}), 500 + finally: + if temp_file.exists(): + temp_file.unlink(missing_ok=True) + + +@app.post("/api/ask") +def ask(): + data = request.get_json(silent=True) or {} + question = (data.get("question") or "").strip() + user_id = (data.get("user_id") or "").strip() + + if not user_id or not question: + return jsonify({"ok": False, "error": "user_id and question are required"}), 400 + + try: + answer = ask_question(question, user_id=user_id) + return jsonify({"ok": True, "answer": answer}) + except Exception as e: + return jsonify({"ok": False, "error": str(e)}), 500 + + +@app.delete("/api/user/") +def delete_user(user_id: str): + try: + data = delete_user_data(user_id) + return jsonify({"ok": True, **data}) + except Exception as e: + return jsonify({"ok": False, "error": str(e)}), 500 + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=int(os.getenv("PORT", "5000")), debug=True) \ No newline at end of file diff --git a/app/static/app.js b/app/static/app.js new file mode 100644 index 0000000..41dc724 --- /dev/null +++ b/app/static/app.js @@ -0,0 +1,151 @@ +(function () { + const API_BASE = "/api"; + + const userIdInput = document.getElementById("userId"); + const uploadForm = document.getElementById("uploadForm"); + const askForm = document.getElementById("askForm"); + const deleteBtn = document.getElementById("deleteData"); + const statusEl = document.getElementById("status"); + const answerBox = document.getElementById("answerBox"); + + function getOrCreateUserId() { + let id = localStorage.getItem("scholar_user_id"); + if (!id) { + id = (window.crypto && crypto.randomUUID) + ? `user_${crypto.randomUUID()}` + : `user_${Math.random().toString(36).slice(2, 10)}_${Date.now()}`; + localStorage.setItem("scholar_user_id", id); + } + if (userIdInput) userIdInput.value = id; + return id; + } + + function currentUserId() { + return userIdInput?.value || getOrCreateUserId(); + } + + function setStatus(msg, isError = false) { + if (!statusEl) return; + statusEl.textContent = msg || ""; + statusEl.style.color = isError ? "#f87171" : "#94a3b8"; + } + + async function safeJson(res) { + try { + return await res.json(); + } catch { + return {}; + } + } + + getOrCreateUserId(); + + uploadForm?.addEventListener("submit", async (e) => { + e.preventDefault(); + + const fileInput = document.getElementById("pdfFile"); + const file = fileInput?.files?.[0]; + + if (!file) { + setStatus("Please select a PDF file.", true); + return; + } + + const submitBtn = uploadForm.querySelector("button[type='submit']"); + const originalText = submitBtn?.textContent || "Upload + Index"; + if (submitBtn) submitBtn.textContent = "Uploading..."; + + const formData = new FormData(); + formData.append("pdf", file); // backend expects 'pdf' + formData.append("user_id", currentUserId()); + + try { + const res = await fetch(`${API_BASE}/upload`, { + method: "POST", + body: formData, + }); + + const data = await safeJson(res); + if (!res.ok) { + setStatus(data.error || "Upload failed.", true); + return; + } + + setStatus(data.message || "PDF indexed successfully."); + } catch { + setStatus("Network error during upload.", true); + } finally { + if (submitBtn) submitBtn.textContent = originalText; + } + }); + + askForm?.addEventListener("submit", async (e) => { + e.preventDefault(); + + const questionInput = document.getElementById("question"); + const question = questionInput?.value?.trim(); + + if (!question) { + setStatus("Please enter a question.", true); + return; + } + + const submitBtn = askForm.querySelector("button[type='submit']"); + const originalText = submitBtn?.textContent || "Ask ScholarAI"; + if (submitBtn) submitBtn.textContent = "Thinking..."; + + if (answerBox) answerBox.textContent = "Thinking..."; + setStatus(""); + + try { + const res = await fetch(`${API_BASE}/ask`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + question, + user_id: currentUserId(), + }), + }); + + const data = await safeJson(res); + if (!res.ok) { + if (answerBox) answerBox.textContent = "No answer yet."; + setStatus(data.error || "Failed to fetch answer.", true); + return; + } + + if (answerBox) answerBox.textContent = data.answer || "No answer returned."; + setStatus("Answer ready."); + } catch { + if (answerBox) answerBox.textContent = "Network error."; + setStatus("Could not reach server.", true); + } finally { + if (submitBtn) submitBtn.textContent = originalText; + } + }); + + deleteBtn?.addEventListener("click", async () => { + const userId = currentUserId(); + const ok = window.confirm("Delete all indexed data for your current session?"); + if (!ok) return; + + setStatus("Deleting data..."); + + try { + const res = await fetch(`${API_BASE}/user/${encodeURIComponent(userId)}`, { + method: "DELETE", + }); + + const data = await safeJson(res); + if (!res.ok) { + setStatus(data.error || "Delete failed.", true); + return; + } + + if (answerBox) answerBox.textContent = "No answer yet."; + setStatus(data.message || "Data deleted."); + } catch { + setStatus("Network error during delete.", true); + } + }); +})(); \ No newline at end of file diff --git a/app/static/images/logo.png b/app/static/images/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..29d0cbfe401f34fe01347175e218e5d8e1becf39 GIT binary patch literal 4048 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 + + + + + ScholarAI MVP | Alpha One Labs + + + + + + + + + + + + + +
+ + +
+

Open Source ยท Privacy-First

+

ScholarAI

+

+ An open-source research assistant by Alpha One Labs. Upload PDF papers, build a searchable index, and get grounded answers using retrieval + LLM workflows โ€” built for students, researchers, and teams. +

+ +
+ + +
+
+ +

Research Assistant

+ +
+ +

Your session is private โ€” auto-generated and stored in your browser only.

+ +
+ +
+
+

Upload PDF

+
+ + +
+
+ +
+

Ask a Question

+
+ + +
+
+ +
+

Answer

+
No answer yet.
+

+
+
+
+
+ + +
+
+ +

How to Use ScholarAI

+
+

Upload one or more PDF files using the Upload panel in the Workspace.

+

Wait for indexing to complete โ€” you'll see a status message when ready.

+

Type a clear, specific question based on your uploaded documents.

+

Review the grounded AI response in the Answer panel below.

+

Use "Delete My Data" anytime to clear your session and all indexed content.

+
+
+
+ +
+ + +
+ + +
+ + + + + + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9007450 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +flask +gunicorn +python-dotenv +langchain +langchain-community +langchain-text-splitters +langchain-google-genai +langchain-chroma +langchain-huggingface +chromadb +pypdf +sentence-transformers \ No newline at end of file From 7f4d691b85ca563f3a959b04e5458b73452fad55 Mon Sep 17 00:00:00 2001 From: Ghanshyam Singh Date: Sat, 14 Mar 2026 21:53:55 +0530 Subject: [PATCH 2/4] update: frontend and RAG pipeline --- app/templates/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/index.html b/app/templates/index.html index 62f338e..370da17 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -3,7 +3,7 @@ - ScholarAI MVP | Alpha One Labs + ScholarAI | Alpha One Labs From e6f042428fb1da29b42216807b3e707740f3b67e Mon Sep 17 00:00:00 2001 From: Ghanshyam Singh Date: Sun, 15 Mar 2026 10:57:52 +0530 Subject: [PATCH 3/4] ScholarAI worker implementation using Cloudflare Workers AI --- .env.example | 6 - .gitignore | 3 +- .../middleware-insertion-facade.js | 10 + .../bundle-lfsPwi/middleware-loader.entry.ts | 134 + .wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js | 3567 +++++++++++++++++ .../tmp/dev-ePVlVV/ProxyServerWorker.js.map | 8 + Prockfile | 1 - README.md | 188 +- app/__init__.py | 0 app/pipeline.py | 124 - app/server.py | 83 - app/static/app.js | 151 - app/static/style.css | 513 --- app/templates/index.html | 155 - package-lock.json | 1504 +++++++ package.json | 14 + requirements.txt | 12 - src/worker.py | 274 ++ {app/static => static}/images/logo.png | Bin static/index.html | 564 +++ static/style.css | 566 +++ wrangler.jsonc | 20 + 22 files changed, 6718 insertions(+), 1179 deletions(-) delete mode 100644 .env.example create mode 100644 .wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js create mode 100644 .wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts create mode 100644 .wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js create mode 100644 .wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js.map delete mode 100644 Prockfile delete mode 100644 app/__init__.py delete mode 100644 app/pipeline.py delete mode 100644 app/server.py delete mode 100644 app/static/app.js delete mode 100644 app/static/style.css delete mode 100644 app/templates/index.html create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 requirements.txt create mode 100644 src/worker.py rename {app/static => static}/images/logo.png (100%) create mode 100644 static/index.html create mode 100644 static/style.css create mode 100644 wrangler.jsonc diff --git a/.env.example b/.env.example deleted file mode 100644 index c9a19e8..0000000 --- a/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -GEMINI_API_KEY=your_gemini_api_key_here -CHUNK_SIZE=1000 -CHUNK_OVERLAP=200 -TOP_K_RESULTS=5 -EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 -LLM_MODEL=gemini-2.5-flash-lite \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1851748..ac4db18 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ __pycache__/ *.pyc .env temp/ -chroma_db/ \ No newline at end of file +chroma_db/ +node_modules/ \ No newline at end of file diff --git a/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js b/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js new file mode 100644 index 0000000..6237209 --- /dev/null +++ b/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js @@ -0,0 +1,10 @@ + import worker, * as OTHER_EXPORTS from "/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/wrangler-dist/ProxyServerWorker.js"; + import * as __MIDDLEWARE_0__ from "/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts"; + + export * from "/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/wrangler-dist/ProxyServerWorker.js"; + const MIDDLEWARE_TEST_INJECT = "__INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__"; + export const __INTERNAL_WRANGLER_MIDDLEWARE__ = [ + + __MIDDLEWARE_0__.default + ] + export default worker; \ No newline at end of file diff --git a/.wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts b/.wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts new file mode 100644 index 0000000..5f0a4bf --- /dev/null +++ b/.wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts @@ -0,0 +1,134 @@ +// This loads all middlewares exposed on the middleware object and then starts +// the invocation chain. The big idea is that we can add these to the middleware +// export dynamically through wrangler, or we can potentially let users directly +// add them as a sort of "plugin" system. + +import ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from "/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js"; +import { __facade_invoke__, __facade_register__, Dispatcher } from "/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/templates/middleware/common.ts"; +import type { WorkerEntrypointConstructor } from "/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js"; + +// Preserve all the exports from the worker +export * from "/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js"; + +class __Facade_ScheduledController__ implements ScheduledController { + readonly #noRetry: ScheduledController["noRetry"]; + + constructor( + readonly scheduledTime: number, + readonly cron: string, + noRetry: ScheduledController["noRetry"] + ) { + this.#noRetry = noRetry; + } + + noRetry() { + if (!(this instanceof __Facade_ScheduledController__)) { + throw new TypeError("Illegal invocation"); + } + // Need to call native method immediately in case uncaught error thrown + this.#noRetry(); + } +} + +function wrapExportedHandler(worker: ExportedHandler): ExportedHandler { + // If we don't have any middleware defined, just return the handler as is + if ( + __INTERNAL_WRANGLER_MIDDLEWARE__ === undefined || + __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0 + ) { + return worker; + } + // Otherwise, register all middleware once + for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { + __facade_register__(middleware); + } + + const fetchDispatcher: ExportedHandlerFetchHandler = function ( + request, + env, + ctx + ) { + if (worker.fetch === undefined) { + throw new Error("Handler does not export a fetch() function."); + } + return worker.fetch(request, env, ctx); + }; + + return { + ...worker, + fetch(request, env, ctx) { + const dispatcher: Dispatcher = function (type, init) { + if (type === "scheduled" && worker.scheduled !== undefined) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => {} + ); + return worker.scheduled(controller, env, ctx); + } + }; + return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher); + }, + }; +} + +function wrapWorkerEntrypoint( + klass: WorkerEntrypointConstructor +): WorkerEntrypointConstructor { + // If we don't have any middleware defined, just return the handler as is + if ( + __INTERNAL_WRANGLER_MIDDLEWARE__ === undefined || + __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0 + ) { + return klass; + } + // Otherwise, register all middleware once + for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { + __facade_register__(middleware); + } + + // `extend`ing `klass` here so other RPC methods remain callable + return class extends klass { + #fetchDispatcher: ExportedHandlerFetchHandler> = ( + request, + env, + ctx + ) => { + this.env = env; + this.ctx = ctx; + if (super.fetch === undefined) { + throw new Error("Entrypoint class does not define a fetch() function."); + } + return super.fetch(request); + }; + + #dispatcher: Dispatcher = (type, init) => { + if (type === "scheduled" && super.scheduled !== undefined) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => {} + ); + return super.scheduled(controller); + } + }; + + fetch(request: Request) { + return __facade_invoke__( + request, + this.env, + this.ctx, + this.#dispatcher, + this.#fetchDispatcher + ); + } + }; +} + +let WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined; +if (typeof ENTRY === "object") { + WRAPPED_ENTRY = wrapExportedHandler(ENTRY); +} else if (typeof ENTRY === "function") { + WRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY); +} +export default WRAPPED_ENTRY; diff --git a/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js b/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js new file mode 100644 index 0000000..fc37982 --- /dev/null +++ b/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js @@ -0,0 +1,3567 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); + +// node_modules/wrangler/wrangler-dist/ProxyServerWorker.js +import * as cfw from "cloudflare:workers"; +import { EmailMessage } from "cloudflare:email"; +var WORKERS_MODULE_SYMBOL = /* @__PURE__ */ Symbol("workers-module"); +globalThis[WORKERS_MODULE_SYMBOL] = cfw; +if (!Symbol.dispose) { + Symbol.dispose = /* @__PURE__ */ Symbol.for("dispose"); +} +if (!Symbol.asyncDispose) { + Symbol.asyncDispose = /* @__PURE__ */ Symbol.for("asyncDispose"); +} +if (!Promise.withResolvers) { + Promise.withResolvers = function() { + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; + }; +} +var workersModule = globalThis[WORKERS_MODULE_SYMBOL]; +var RpcTarget = workersModule ? workersModule.RpcTarget : class { +}; +var AsyncFunction = (async function() { +}).constructor; +function typeForRpc(value) { + switch (typeof value) { + case "boolean": + case "number": + case "string": + return "primitive"; + case "undefined": + return "undefined"; + case "object": + case "function": + break; + case "bigint": + return "bigint"; + default: + return "unsupported"; + } + if (value === null) { + return "primitive"; + } + let prototype = Object.getPrototypeOf(value); + switch (prototype) { + case Object.prototype: + return "object"; + case Function.prototype: + case AsyncFunction.prototype: + return "function"; + case Array.prototype: + return "array"; + case Date.prototype: + return "date"; + case Uint8Array.prototype: + return "bytes"; + case WritableStream.prototype: + return "writable"; + case ReadableStream.prototype: + return "readable"; + case Headers.prototype: + return "headers"; + case Request.prototype: + return "request"; + case Response.prototype: + return "response"; + // TODO: All other structured clone types. + case RpcStub.prototype: + return "stub"; + case RpcPromise.prototype: + return "rpc-promise"; + // TODO: Promise or thenable + default: + if (workersModule) { + if (prototype == workersModule.RpcStub.prototype || value instanceof workersModule.ServiceStub) { + return "rpc-target"; + } else if (prototype == workersModule.RpcPromise.prototype || prototype == workersModule.RpcProperty.prototype) { + return "rpc-thenable"; + } + } + if (value instanceof RpcTarget) { + return "rpc-target"; + } + if (value instanceof Error) { + return "error"; + } + return "unsupported"; + } +} +__name(typeForRpc, "typeForRpc"); +function mapNotLoaded() { + throw new Error("RPC map() implementation was not loaded."); +} +__name(mapNotLoaded, "mapNotLoaded"); +var mapImpl = { applyMap: mapNotLoaded, sendMap: mapNotLoaded }; +function streamNotLoaded() { + throw new Error("Stream implementation was not loaded."); +} +__name(streamNotLoaded, "streamNotLoaded"); +var streamImpl = { + createWritableStreamHook: streamNotLoaded, + createWritableStreamFromHook: streamNotLoaded, + createReadableStreamHook: streamNotLoaded +}; +var StubHook = class { + static { + __name(this, "StubHook"); + } + // Like call(), but designed for streaming calls (e.g. WritableStream writes). Returns: + // - promise: A Promise for the completion of the call. + // - size: If the call was remote, the byte size of the serialized message. For local calls, + // undefined is returned, indicating the caller should await the promise to serialize writes + // (no overlapping). + stream(path, args) { + let hook = this.call(path, args); + let pulled = hook.pull(); + let promise; + if (pulled instanceof Promise) { + promise = pulled.then((p) => { + p.dispose(); + }); + } else { + pulled.dispose(); + promise = Promise.resolve(); + } + return { promise }; + } +}; +var ErrorStubHook = class extends StubHook { + static { + __name(this, "ErrorStubHook"); + } + constructor(error) { + super(); + this.error = error; + } + call(path, args) { + return this; + } + map(path, captures, instructions) { + return this; + } + get(path) { + return this; + } + dup() { + return this; + } + pull() { + return Promise.reject(this.error); + } + ignoreUnhandledRejections() { + } + dispose() { + } + onBroken(callback) { + try { + callback(this.error); + } catch (err) { + Promise.resolve(err); + } + } +}; +var DISPOSED_HOOK = new ErrorStubHook( + new Error("Attempted to use RPC stub after it has been disposed.") +); +var doCall = /* @__PURE__ */ __name((hook, path, params) => { + return hook.call(path, params); +}, "doCall"); +function withCallInterceptor(interceptor, callback) { + let oldValue = doCall; + doCall = interceptor; + try { + return callback(); + } finally { + doCall = oldValue; + } +} +__name(withCallInterceptor, "withCallInterceptor"); +var RAW_STUB = /* @__PURE__ */ Symbol("realStub"); +var PROXY_HANDLERS = { + apply(target, thisArg, argumentsList) { + let stub = target.raw; + return new RpcPromise(doCall( + stub.hook, + stub.pathIfPromise || [], + RpcPayload.fromAppParams(argumentsList) + ), []); + }, + get(target, prop, receiver) { + let stub = target.raw; + if (prop === RAW_STUB) { + return stub; + } else if (prop in RpcPromise.prototype) { + return stub[prop]; + } else if (typeof prop === "string") { + return new RpcPromise( + stub.hook, + stub.pathIfPromise ? [...stub.pathIfPromise, prop] : [prop] + ); + } else if (prop === Symbol.dispose && (!stub.pathIfPromise || stub.pathIfPromise.length == 0)) { + return () => { + stub.hook.dispose(); + stub.hook = DISPOSED_HOOK; + }; + } else { + return void 0; + } + }, + has(target, prop) { + let stub = target.raw; + if (prop === RAW_STUB) { + return true; + } else if (prop in RpcPromise.prototype) { + return prop in stub; + } else if (typeof prop === "string") { + return true; + } else if (prop === Symbol.dispose && (!stub.pathIfPromise || stub.pathIfPromise.length == 0)) { + return true; + } else { + return false; + } + }, + construct(target, args) { + throw new Error("An RPC stub cannot be used as a constructor."); + }, + defineProperty(target, property, attributes) { + throw new Error("Can't define properties on RPC stubs."); + }, + deleteProperty(target, p) { + throw new Error("Can't delete properties on RPC stubs."); + }, + getOwnPropertyDescriptor(target, p) { + return void 0; + }, + getPrototypeOf(target) { + return Object.getPrototypeOf(target.raw); + }, + isExtensible(target) { + return false; + }, + ownKeys(target) { + return []; + }, + preventExtensions(target) { + return true; + }, + set(target, p, newValue, receiver) { + throw new Error("Can't assign properties on RPC stubs."); + }, + setPrototypeOf(target, v) { + throw new Error("Can't override prototype of RPC stubs."); + } +}; +var RpcStub = class _RpcStub extends RpcTarget { + static { + __name(this, "_RpcStub"); + } + // Although `hook` and `path` are declared `public` here, they are effectively hidden by the + // proxy. + constructor(hook, pathIfPromise) { + super(); + if (!(hook instanceof StubHook)) { + let value = hook; + if (value instanceof RpcTarget || value instanceof Function) { + hook = TargetStubHook.create(value, void 0); + } else { + hook = new PayloadStubHook(RpcPayload.fromAppReturn(value)); + } + if (pathIfPromise) { + throw new TypeError("RpcStub constructor expected one argument, received two."); + } + } + this.hook = hook; + this.pathIfPromise = pathIfPromise; + let func = /* @__PURE__ */ __name(() => { + }, "func"); + func.raw = this; + return new Proxy(func, PROXY_HANDLERS); + } + hook; + pathIfPromise; + dup() { + let target = this[RAW_STUB]; + if (target.pathIfPromise) { + return new _RpcStub(target.hook.get(target.pathIfPromise)); + } else { + return new _RpcStub(target.hook.dup()); + } + } + onRpcBroken(callback) { + this[RAW_STUB].hook.onBroken(callback); + } + map(func) { + let { hook, pathIfPromise } = this[RAW_STUB]; + return mapImpl.sendMap(hook, pathIfPromise || [], func); + } + toString() { + return "[object RpcStub]"; + } +}; +var RpcPromise = class extends RpcStub { + static { + __name(this, "RpcPromise"); + } + // TODO: Support passing target value or promise to constructor. + constructor(hook, pathIfPromise) { + super(hook, pathIfPromise); + } + then(onfulfilled, onrejected) { + return pullPromise(this).then(...arguments); + } + catch(onrejected) { + return pullPromise(this).catch(...arguments); + } + finally(onfinally) { + return pullPromise(this).finally(...arguments); + } + toString() { + return "[object RpcPromise]"; + } +}; +function unwrapStubTakingOwnership(stub) { + let { hook, pathIfPromise } = stub[RAW_STUB]; + if (pathIfPromise && pathIfPromise.length > 0) { + return hook.get(pathIfPromise); + } else { + return hook; + } +} +__name(unwrapStubTakingOwnership, "unwrapStubTakingOwnership"); +function unwrapStubAndDup(stub) { + let { hook, pathIfPromise } = stub[RAW_STUB]; + if (pathIfPromise) { + return hook.get(pathIfPromise); + } else { + return hook.dup(); + } +} +__name(unwrapStubAndDup, "unwrapStubAndDup"); +function unwrapStubNoProperties(stub) { + let { hook, pathIfPromise } = stub[RAW_STUB]; + if (pathIfPromise && pathIfPromise.length > 0) { + return void 0; + } + return hook; +} +__name(unwrapStubNoProperties, "unwrapStubNoProperties"); +function unwrapStubOrParent(stub) { + return stub[RAW_STUB].hook; +} +__name(unwrapStubOrParent, "unwrapStubOrParent"); +function unwrapStubAndPath(stub) { + return stub[RAW_STUB]; +} +__name(unwrapStubAndPath, "unwrapStubAndPath"); +async function pullPromise(promise) { + let { hook, pathIfPromise } = promise[RAW_STUB]; + if (pathIfPromise.length > 0) { + hook = hook.get(pathIfPromise); + } + let payload = await hook.pull(); + return payload.deliverResolve(); +} +__name(pullPromise, "pullPromise"); +var RpcPayload = class _RpcPayload { + static { + __name(this, "_RpcPayload"); + } + // Private constructor; use factory functions above to construct. + constructor(value, source, hooks, promises) { + this.value = value; + this.source = source; + this.hooks = hooks; + this.promises = promises; + } + // Create a payload from a value passed as params to an RPC from the app. + // + // The payload does NOT take ownership of any stubs in `value`, and but promises not to modify + // `value`. If the payload is delivered locally, `value` will be deep-copied first, so as not + // to have the sender and recipient end up sharing the same mutable object. `value` will not be + // touched again after the call returns synchronously (returns a promise) -- by that point, + // the value has either been copied or serialized to the wire. + static fromAppParams(value) { + return new _RpcPayload(value, "params"); + } + // Create a payload from a value return from an RPC implementation by the app. + // + // Unlike fromAppParams(), in this case the payload takes ownership of all stubs in `value`, and + // may hold onto `value` for an arbitrarily long time (e.g. to serve pipelined requests). It + // will still avoid modifying `value` and will make a deep copy if it is delivered locally. + static fromAppReturn(value) { + return new _RpcPayload(value, "return"); + } + // Combine an array of payloads into a single payload whose value is an array. Ownership of all + // stubs is transferred from the inputs to the outputs, hence if the output is disposed, the + // inputs should not be. (In case of exception, nothing is disposed, though.) + static fromArray(array) { + let hooks = []; + let promises = []; + let resultArray = []; + for (let payload of array) { + payload.ensureDeepCopied(); + for (let hook of payload.hooks) { + hooks.push(hook); + } + for (let promise of payload.promises) { + if (promise.parent === payload) { + promise = { + parent: resultArray, + property: resultArray.length, + promise: promise.promise + }; + } + promises.push(promise); + } + resultArray.push(payload.value); + } + return new _RpcPayload(resultArray, "owned", hooks, promises); + } + // Create a payload from a value parsed off the wire using Evaluator.evaluate(). + // + // A payload is constructed with a null value and the given hooks and promises arrays. The value + // is expected to be filled in by the evaluator, and the hooks and promises arrays are expected + // to be extended with stubs found during parsing. (This weird usage model is necessary so that + // if the root value turns out to be a promise, its `parent` in `promises` can be the payload + // object itself.) + // + // When done, the payload takes ownership of the final value and all the stubs within. It may + // modify the value in preparation for delivery, and may deliver the value directly to the app + // without copying. + static forEvaluate(hooks, promises) { + return new _RpcPayload(null, "owned", hooks, promises); + } + // Deep-copy the given value, including dup()ing all stubs. + // + // If `value` is a function, it should be bound to `oldParent` as its `this`. + // + // If deep-copying from a branch of some other RpcPayload, it must be provided, to make sure + // RpcTargets found within don't get duplicate stubs. + static deepCopyFrom(value, oldParent, owner) { + let result = new _RpcPayload(null, "owned", [], []); + result.value = result.deepCopy( + value, + oldParent, + "value", + result, + /*dupStubs=*/ + true, + owner + ); + return result; + } + // For `source === "return"` payloads only, this tracks any StubHooks created around RpcTargets + // or WritableStreams found in the payload at the time that it is serialized (or deep-copied) for + // return, so that we can make sure they are not disposed before the pipeline ends. + // + // This is initialized on first use. + rpcTargets; + // Get the StubHook representing the given RpcTarget found inside this payload. + getHookForRpcTarget(target, parent, dupStubs = true) { + if (this.source === "params") { + if (dupStubs) { + let dupable = target; + if (typeof dupable.dup === "function") { + target = dupable.dup(); + } + } + return TargetStubHook.create(target, parent); + } else if (this.source === "return") { + let hook = this.rpcTargets?.get(target); + if (hook) { + if (dupStubs) { + return hook.dup(); + } else { + this.rpcTargets?.delete(target); + return hook; + } + } else { + hook = TargetStubHook.create(target, parent); + if (dupStubs) { + if (!this.rpcTargets) { + this.rpcTargets = /* @__PURE__ */ new Map(); + } + this.rpcTargets.set(target, hook); + return hook.dup(); + } else { + return hook; + } + } + } else { + throw new Error("owned payload shouldn't contain raw RpcTargets"); + } + } + // Get the StubHook representing the given WritableStream found inside this payload. + getHookForWritableStream(stream, parent, dupStubs = true) { + if (this.source === "params") { + return streamImpl.createWritableStreamHook(stream); + } else if (this.source === "return") { + let hook = this.rpcTargets?.get(stream); + if (hook) { + if (dupStubs) { + return hook.dup(); + } else { + this.rpcTargets?.delete(stream); + return hook; + } + } else { + hook = streamImpl.createWritableStreamHook(stream); + if (dupStubs) { + if (!this.rpcTargets) { + this.rpcTargets = /* @__PURE__ */ new Map(); + } + this.rpcTargets.set(stream, hook); + return hook.dup(); + } else { + return hook; + } + } + } else { + throw new Error("owned payload shouldn't contain raw WritableStreams"); + } + } + // Get the StubHook representing the given ReadableStream found inside this payload. + getHookForReadableStream(stream, parent, dupStubs = true) { + if (this.source === "params") { + return streamImpl.createReadableStreamHook(stream); + } else if (this.source === "return") { + let hook = this.rpcTargets?.get(stream); + if (hook) { + if (dupStubs) { + return hook.dup(); + } else { + this.rpcTargets?.delete(stream); + return hook; + } + } else { + hook = streamImpl.createReadableStreamHook(stream); + if (dupStubs) { + if (!this.rpcTargets) { + this.rpcTargets = /* @__PURE__ */ new Map(); + } + this.rpcTargets.set(stream, hook); + return hook.dup(); + } else { + return hook; + } + } + } else { + throw new Error("owned payload shouldn't contain raw ReadableStreams"); + } + } + deepCopy(value, oldParent, property, parent, dupStubs, owner) { + let kind = typeForRpc(value); + switch (kind) { + case "unsupported": + return value; + case "primitive": + case "bigint": + case "date": + case "bytes": + case "error": + case "undefined": + return value; + case "array": { + let array = value; + let len = array.length; + let result = new Array(len); + for (let i = 0; i < len; i++) { + result[i] = this.deepCopy(array[i], array, i, result, dupStubs, owner); + } + return result; + } + case "object": { + let result = {}; + let object = value; + for (let i in object) { + result[i] = this.deepCopy(object[i], object, i, result, dupStubs, owner); + } + return result; + } + case "stub": + case "rpc-promise": { + let stub = value; + let hook; + if (dupStubs) { + hook = unwrapStubAndDup(stub); + } else { + hook = unwrapStubTakingOwnership(stub); + } + if (stub instanceof RpcPromise) { + let promise = new RpcPromise(hook, []); + this.promises.push({ parent, property, promise }); + return promise; + } else { + this.hooks.push(hook); + return new RpcStub(hook); + } + } + case "function": + case "rpc-target": { + let target = value; + let hook; + if (owner) { + hook = owner.getHookForRpcTarget(target, oldParent, dupStubs); + } else { + hook = TargetStubHook.create(target, oldParent); + } + this.hooks.push(hook); + return new RpcStub(hook); + } + case "rpc-thenable": { + let target = value; + let promise; + if (owner) { + promise = new RpcPromise(owner.getHookForRpcTarget(target, oldParent, dupStubs), []); + } else { + promise = new RpcPromise(TargetStubHook.create(target, oldParent), []); + } + this.promises.push({ parent, property, promise }); + return promise; + } + case "writable": { + let stream = value; + let hook; + if (owner) { + hook = owner.getHookForWritableStream(stream, oldParent, dupStubs); + } else { + hook = streamImpl.createWritableStreamHook(stream); + } + this.hooks.push(hook); + return stream; + } + case "readable": { + let stream = value; + let hook; + if (owner) { + hook = owner.getHookForReadableStream(stream, oldParent, dupStubs); + } else { + hook = streamImpl.createReadableStreamHook(stream); + } + this.hooks.push(hook); + return stream; + } + case "headers": + return new Headers(value); + case "request": { + let req = value; + if (req.body) { + this.deepCopy(req.body, req, "body", req, dupStubs, owner); + } + return new Request(req); + } + case "response": { + let resp = value; + if (resp.body) { + this.deepCopy(resp.body, resp, "body", resp, dupStubs, owner); + } + return new Response(resp.body, resp); + } + default: + throw new Error("unreachable"); + } + } + // Ensures that if the value originally came from an unowned source, we have replaced it with a + // deep copy. + ensureDeepCopied() { + if (this.source !== "owned") { + let dupStubs = this.source === "params"; + this.hooks = []; + this.promises = []; + try { + this.value = this.deepCopy(this.value, void 0, "value", this, dupStubs, this); + } catch (err) { + this.hooks = void 0; + this.promises = void 0; + throw err; + } + this.source = "owned"; + if (this.rpcTargets && this.rpcTargets.size > 0) { + throw new Error("Not all rpcTargets were accounted for in deep-copy?"); + } + this.rpcTargets = void 0; + } + } + // Resolve all promises in this payload and then assign the final value into `parent[property]`. + deliverTo(parent, property, promises) { + this.ensureDeepCopied(); + if (this.value instanceof RpcPromise) { + _RpcPayload.deliverRpcPromiseTo(this.value, parent, property, promises); + } else { + parent[property] = this.value; + for (let record of this.promises) { + _RpcPayload.deliverRpcPromiseTo(record.promise, record.parent, record.property, promises); + } + } + } + static deliverRpcPromiseTo(promise, parent, property, promises) { + let hook = unwrapStubNoProperties(promise); + if (!hook) { + throw new Error("property promises should have been resolved earlier"); + } + let inner = hook.pull(); + if (inner instanceof _RpcPayload) { + inner.deliverTo(parent, property, promises); + } else { + promises.push(inner.then((payload) => { + let subPromises = []; + payload.deliverTo(parent, property, subPromises); + if (subPromises.length > 0) { + return Promise.all(subPromises); + } + })); + } + } + // Call the given function with the payload as an argument. The call is made synchronously if + // possible, in order to maintain e-order. However, if any RpcPromises exist in the payload, + // they are awaited and substituted before calling the function. The result of the call is + // wrapped into another payload. + // + // The payload is automatically disposed after the call completes. The caller should not call + // dispose(). + async deliverCall(func, thisArg) { + try { + let promises = []; + this.deliverTo(this, "value", promises); + if (promises.length > 0) { + await Promise.all(promises); + } + let result = Function.prototype.apply.call(func, thisArg, this.value); + if (result instanceof RpcPromise) { + return _RpcPayload.fromAppReturn(result); + } else { + return _RpcPayload.fromAppReturn(await result); + } + } finally { + this.dispose(); + } + } + // Produce a promise for this payload for return to the application. Any RpcPromises in the + // payload are awaited and substituted with their results first. + // + // The returned object will have a disposer which disposes the payload. The caller should not + // separately dispose it. + async deliverResolve() { + try { + let promises = []; + this.deliverTo(this, "value", promises); + if (promises.length > 0) { + await Promise.all(promises); + } + let result = this.value; + if (result instanceof Object) { + if (!(Symbol.dispose in result)) { + Object.defineProperty(result, Symbol.dispose, { + // NOTE: Using `this.dispose.bind(this)` here causes Playwright's build of + // Chromium 140.0.7339.16 to fail when the object is assigned to a `using` variable, + // with the error: + // TypeError: Symbol(Symbol.dispose) is not a function + // I cannot reproduce this problem in Chrome 140.0.7339.127 nor in Node or workerd, + // so maybe it was a short-lived V8 bug or something. To be safe, though, we use + // `() => this.dispose()`, which seems to always work. + value: /* @__PURE__ */ __name(() => this.dispose(), "value"), + writable: true, + enumerable: false, + configurable: true + }); + } + } + return result; + } catch (err) { + this.dispose(); + throw err; + } + } + dispose() { + if (this.source === "owned") { + this.hooks.forEach((hook) => hook.dispose()); + this.promises.forEach((promise) => promise.promise[Symbol.dispose]()); + } else if (this.source === "return") { + this.disposeImpl(this.value, void 0); + if (this.rpcTargets && this.rpcTargets.size > 0) { + throw new Error("Not all rpcTargets were accounted for in disposeImpl()?"); + } + } else ; + this.source = "owned"; + this.hooks = []; + this.promises = []; + } + // Recursive dispose, called only when `source` is "return". + disposeImpl(value, parent) { + let kind = typeForRpc(value); + switch (kind) { + case "unsupported": + case "primitive": + case "bigint": + case "bytes": + case "date": + case "error": + case "undefined": + return; + case "array": { + let array = value; + let len = array.length; + for (let i = 0; i < len; i++) { + this.disposeImpl(array[i], array); + } + return; + } + case "object": { + let object = value; + for (let i in object) { + this.disposeImpl(object[i], object); + } + return; + } + case "stub": + case "rpc-promise": { + let stub = value; + let hook = unwrapStubNoProperties(stub); + if (hook) { + hook.dispose(); + } + return; + } + case "function": + case "rpc-target": { + let target = value; + let hook = this.rpcTargets?.get(target); + if (hook) { + hook.dispose(); + this.rpcTargets.delete(target); + } else { + disposeRpcTarget(target); + } + return; + } + case "rpc-thenable": + return; + case "headers": + return; + case "request": { + let req = value; + if (req.body) this.disposeImpl(req.body, req); + return; + } + case "response": { + let resp = value; + if (resp.body) this.disposeImpl(resp.body, resp); + return; + } + case "writable": { + let stream = value; + let hook = this.rpcTargets?.get(stream); + if (hook) { + this.rpcTargets.delete(stream); + } else { + hook = streamImpl.createWritableStreamHook(stream); + } + hook.dispose(); + return; + } + case "readable": { + let stream = value; + let hook = this.rpcTargets?.get(stream); + if (hook) { + this.rpcTargets.delete(stream); + } else { + hook = streamImpl.createReadableStreamHook(stream); + } + hook.dispose(); + return; + } + default: + return; + } + } + // Ignore unhandled rejections in all promises in this payload -- that is, all promises that + // *would* be awaited if this payload were to be delivered. See the similarly-named method of + // StubHook for explanation. + ignoreUnhandledRejections() { + if (this.hooks) { + this.hooks.forEach((hook) => { + hook.ignoreUnhandledRejections(); + }); + this.promises.forEach( + (promise) => unwrapStubOrParent(promise.promise).ignoreUnhandledRejections() + ); + } else { + this.ignoreUnhandledRejectionsImpl(this.value); + } + } + ignoreUnhandledRejectionsImpl(value) { + let kind = typeForRpc(value); + switch (kind) { + case "unsupported": + case "primitive": + case "bigint": + case "bytes": + case "date": + case "error": + case "undefined": + case "function": + case "rpc-target": + case "writable": + case "readable": + case "headers": + case "request": + case "response": + return; + case "array": { + let array = value; + let len = array.length; + for (let i = 0; i < len; i++) { + this.ignoreUnhandledRejectionsImpl(array[i]); + } + return; + } + case "object": { + let object = value; + for (let i in object) { + this.ignoreUnhandledRejectionsImpl(object[i]); + } + return; + } + case "stub": + case "rpc-promise": + unwrapStubOrParent(value).ignoreUnhandledRejections(); + return; + case "rpc-thenable": + value.then((_) => { + }, (_) => { + }); + return; + default: + return; + } + } +}; +function followPath(value, parent, path, owner) { + for (let i = 0; i < path.length; i++) { + parent = value; + let part = path[i]; + if (part in Object.prototype) { + value = void 0; + continue; + } + let kind = typeForRpc(value); + switch (kind) { + case "object": + case "function": + if (Object.hasOwn(value, part)) { + value = value[part]; + } else { + value = void 0; + } + break; + case "array": + if (Number.isInteger(part) && part >= 0) { + value = value[part]; + } else { + value = void 0; + } + break; + case "rpc-target": + case "rpc-thenable": { + if (Object.hasOwn(value, part)) { + throw new TypeError( + `Attempted to access property '${part}', which is an instance property of the RpcTarget. To avoid leaking private internals, instance properties cannot be accessed over RPC. If you want to make this property available over RPC, define it as a method or getter on the class, instead of an instance property.` + ); + } else { + value = value[part]; + } + owner = null; + break; + } + case "stub": + case "rpc-promise": { + let { hook, pathIfPromise } = unwrapStubAndPath(value); + return { hook, remainingPath: pathIfPromise ? pathIfPromise.concat(path.slice(i)) : path.slice(i) }; + } + case "writable": + value = void 0; + break; + case "readable": + value = void 0; + break; + case "primitive": + case "bigint": + case "bytes": + case "date": + case "error": + case "headers": + case "request": + case "response": + value = void 0; + break; + case "undefined": + value = value[part]; + break; + case "unsupported": { + if (i === 0) { + throw new TypeError(`RPC stub points at a non-serializable type.`); + } else { + let prefix = path.slice(0, i).join("."); + let remainder = path.slice(0, i).join("."); + throw new TypeError( + `'${prefix}' is not a serializable type, so property ${remainder} cannot be accessed.` + ); + } + } + default: + throw new TypeError("unreachable"); + } + } + if (value instanceof RpcPromise) { + let { hook, pathIfPromise } = unwrapStubAndPath(value); + return { hook, remainingPath: pathIfPromise || [] }; + } + return { + value, + parent, + owner + }; +} +__name(followPath, "followPath"); +var ValueStubHook = class extends StubHook { + static { + __name(this, "ValueStubHook"); + } + call(path, args) { + try { + let { value, owner } = this.getValue(); + let followResult = followPath(value, void 0, path, owner); + if (followResult.hook) { + return followResult.hook.call(followResult.remainingPath, args); + } + if (typeof followResult.value != "function") { + throw new TypeError(`'${path.join(".")}' is not a function.`); + } + let promise = args.deliverCall(followResult.value, followResult.parent); + return new PromiseStubHook(promise.then((payload) => { + return new PayloadStubHook(payload); + })); + } catch (err) { + return new ErrorStubHook(err); + } + } + map(path, captures, instructions) { + try { + let followResult; + try { + let { value, owner } = this.getValue(); + followResult = followPath(value, void 0, path, owner); + ; + } catch (err) { + for (let cap of captures) { + cap.dispose(); + } + throw err; + } + if (followResult.hook) { + return followResult.hook.map(followResult.remainingPath, captures, instructions); + } + return mapImpl.applyMap( + followResult.value, + followResult.parent, + followResult.owner, + captures, + instructions + ); + } catch (err) { + return new ErrorStubHook(err); + } + } + get(path) { + try { + let { value, owner } = this.getValue(); + if (path.length === 0 && owner === null) { + throw new Error("Can't dup an RpcTarget stub as a promise."); + } + let followResult = followPath(value, void 0, path, owner); + if (followResult.hook) { + return followResult.hook.get(followResult.remainingPath); + } + return new PayloadStubHook(RpcPayload.deepCopyFrom( + followResult.value, + followResult.parent, + followResult.owner + )); + } catch (err) { + return new ErrorStubHook(err); + } + } +}; +var PayloadStubHook = class _PayloadStubHook extends ValueStubHook { + static { + __name(this, "_PayloadStubHook"); + } + constructor(payload) { + super(); + this.payload = payload; + } + payload; + // cleared when disposed + getPayload() { + if (this.payload) { + return this.payload; + } else { + throw new Error("Attempted to use an RPC StubHook after it was disposed."); + } + } + getValue() { + let payload = this.getPayload(); + return { value: payload.value, owner: payload }; + } + dup() { + let thisPayload = this.getPayload(); + return new _PayloadStubHook(RpcPayload.deepCopyFrom( + thisPayload.value, + void 0, + thisPayload + )); + } + pull() { + return this.getPayload(); + } + ignoreUnhandledRejections() { + if (this.payload) { + this.payload.ignoreUnhandledRejections(); + } + } + dispose() { + if (this.payload) { + this.payload.dispose(); + this.payload = void 0; + } + } + onBroken(callback) { + if (this.payload) { + if (this.payload.value instanceof RpcStub) { + this.payload.value.onRpcBroken(callback); + } + } + } +}; +function disposeRpcTarget(target) { + if (Symbol.dispose in target) { + try { + target[Symbol.dispose](); + } catch (err) { + Promise.reject(err); + } + } +} +__name(disposeRpcTarget, "disposeRpcTarget"); +var TargetStubHook = class _TargetStubHook extends ValueStubHook { + static { + __name(this, "_TargetStubHook"); + } + // Constructs a TargetStubHook that is not duplicated from an existing hook. + // + // If `value` is a function, `parent` is bound as its "this". + static create(value, parent) { + if (typeof value !== "function") { + parent = void 0; + } + return new _TargetStubHook(value, parent); + } + constructor(target, parent, dupFrom) { + super(); + this.target = target; + this.parent = parent; + if (dupFrom) { + if (dupFrom.refcount) { + this.refcount = dupFrom.refcount; + ++this.refcount.count; + } + } else if (Symbol.dispose in target) { + this.refcount = { count: 1 }; + } + } + target; + // cleared when disposed + parent; + // `this` parameter when calling `target` + refcount; + // undefined if not needed (because target has no disposer) + getTarget() { + if (this.target) { + return this.target; + } else { + throw new Error("Attempted to use an RPC StubHook after it was disposed."); + } + } + getValue() { + return { value: this.getTarget(), owner: null }; + } + dup() { + return new _TargetStubHook(this.getTarget(), this.parent, this); + } + pull() { + let target = this.getTarget(); + if ("then" in target) { + return Promise.resolve(target).then((resolution) => { + return RpcPayload.fromAppReturn(resolution); + }); + } else { + return Promise.reject(new Error("Tried to resolve a non-promise stub.")); + } + } + ignoreUnhandledRejections() { + } + dispose() { + if (this.target) { + if (this.refcount) { + if (--this.refcount.count == 0) { + disposeRpcTarget(this.target); + } + } + this.target = void 0; + } + } + onBroken(callback) { + } +}; +var PromiseStubHook = class _PromiseStubHook extends StubHook { + static { + __name(this, "_PromiseStubHook"); + } + promise; + resolution; + constructor(promise) { + super(); + this.promise = promise.then((res) => { + this.resolution = res; + return res; + }); + } + call(path, args) { + args.ensureDeepCopied(); + return new _PromiseStubHook(this.promise.then((hook) => hook.call(path, args))); + } + stream(path, args) { + args.ensureDeepCopied(); + let promise = this.promise.then((hook) => { + let result = hook.stream(path, args); + return result.promise; + }); + return { promise }; + } + map(path, captures, instructions) { + return new _PromiseStubHook(this.promise.then( + (hook) => hook.map(path, captures, instructions), + (err) => { + for (let cap of captures) { + cap.dispose(); + } + throw err; + } + )); + } + get(path) { + return new _PromiseStubHook(this.promise.then((hook) => hook.get(path))); + } + dup() { + if (this.resolution) { + return this.resolution.dup(); + } else { + return new _PromiseStubHook(this.promise.then((hook) => hook.dup())); + } + } + pull() { + if (this.resolution) { + return this.resolution.pull(); + } else { + return this.promise.then((hook) => hook.pull()); + } + } + ignoreUnhandledRejections() { + if (this.resolution) { + this.resolution.ignoreUnhandledRejections(); + } else { + this.promise.then((res) => { + res.ignoreUnhandledRejections(); + }, (err) => { + }); + } + } + dispose() { + if (this.resolution) { + this.resolution.dispose(); + } else { + this.promise.then((hook) => { + hook.dispose(); + }, (err) => { + }); + } + } + onBroken(callback) { + if (this.resolution) { + this.resolution.onBroken(callback); + } else { + this.promise.then((hook) => { + hook.onBroken(callback); + }, callback); + } + } +}; +var NullExporter = class { + static { + __name(this, "NullExporter"); + } + exportStub(stub) { + throw new Error("Cannot serialize RPC stubs without an RPC session."); + } + exportPromise(stub) { + throw new Error("Cannot serialize RPC stubs without an RPC session."); + } + getImport(hook) { + return void 0; + } + unexport(ids) { + } + createPipe(readable) { + throw new Error("Cannot create pipes without an RPC session."); + } + onSendError(error) { + } +}; +var NULL_EXPORTER = new NullExporter(); +var ERROR_TYPES = { + Error, + EvalError, + RangeError, + ReferenceError, + SyntaxError, + TypeError, + URIError, + AggregateError + // TODO: DOMError? Others? +}; +var Devaluator = class _Devaluator { + static { + __name(this, "_Devaluator"); + } + constructor(exporter, source) { + this.exporter = exporter; + this.source = source; + } + // Devaluate the given value. + // * value: The value to devaluate. + // * parent: The value's parent object, which would be used as `this` if the value were called + // as a function. + // * exporter: Callbacks to the RPC session for exporting capabilities found in this message. + // * source: The RpcPayload which contains the value, and therefore owns stubs within. + // + // Returns: The devaluated value, ready to be JSON-serialized. + static devaluate(value, parent, exporter = NULL_EXPORTER, source) { + let devaluator = new _Devaluator(exporter, source); + try { + return devaluator.devaluateImpl(value, parent, 0); + } catch (err) { + if (devaluator.exports) { + try { + exporter.unexport(devaluator.exports); + } catch (err2) { + } + } + throw err; + } + } + exports; + devaluateImpl(value, parent, depth) { + if (depth >= 64) { + throw new Error( + "Serialization exceeded maximum allowed depth. (Does the message contain cycles?)" + ); + } + let kind = typeForRpc(value); + switch (kind) { + case "unsupported": { + let msg; + try { + msg = `Cannot serialize value: ${value}`; + } catch (err) { + msg = "Cannot serialize value: (couldn't stringify value)"; + } + throw new TypeError(msg); + } + case "primitive": + if (typeof value === "number" && !isFinite(value)) { + if (value === Infinity) { + return ["inf"]; + } else if (value === -Infinity) { + return ["-inf"]; + } else { + return ["nan"]; + } + } else { + return value; + } + case "object": { + let object = value; + let result = {}; + for (let key in object) { + result[key] = this.devaluateImpl(object[key], object, depth + 1); + } + return result; + } + case "array": { + let array = value; + let len = array.length; + let result = new Array(len); + for (let i = 0; i < len; i++) { + result[i] = this.devaluateImpl(array[i], array, depth + 1); + } + return [result]; + } + case "bigint": + return ["bigint", value.toString()]; + case "date": + return ["date", value.getTime()]; + case "bytes": { + let bytes = value; + if (bytes.toBase64) { + return ["bytes", bytes.toBase64({ omitPadding: true })]; + } else { + return [ + "bytes", + btoa(String.fromCharCode.apply(null, bytes).replace(/=*$/, "")) + ]; + } + } + case "headers": + return ["headers", [...value]]; + case "request": { + let req = value; + let init = {}; + if (req.method !== "GET") init.method = req.method; + let headers = [...req.headers]; + if (headers.length > 0) { + init.headers = headers; + } + if (req.body) { + init.body = this.devaluateImpl(req.body, req, depth + 1); + init.duplex = req.duplex || "half"; + } else if (req.body === void 0 && !["GET", "HEAD", "OPTIONS", "TRACE", "DELETE"].includes(req.method)) { + let bodyPromise = req.arrayBuffer(); + let readable = new ReadableStream({ + async start(controller) { + try { + controller.enqueue(new Uint8Array(await bodyPromise)); + controller.close(); + } catch (err) { + controller.error(err); + } + } + }); + let hook = streamImpl.createReadableStreamHook(readable); + let importId = this.exporter.createPipe(readable, hook); + init.body = ["readable", importId]; + init.duplex = req.duplex || "half"; + } + if (req.cache && req.cache !== "default") init.cache = req.cache; + if (req.redirect !== "follow") init.redirect = req.redirect; + if (req.integrity) init.integrity = req.integrity; + if (req.mode && req.mode !== "cors") init.mode = req.mode; + if (req.credentials && req.credentials !== "same-origin") { + init.credentials = req.credentials; + } + if (req.referrer && req.referrer !== "about:client") init.referrer = req.referrer; + if (req.referrerPolicy) init.referrerPolicy = req.referrerPolicy; + if (req.keepalive) init.keepalive = req.keepalive; + let cfReq = req; + if (cfReq.cf) init.cf = cfReq.cf; + if (cfReq.encodeResponseBody && cfReq.encodeResponseBody !== "automatic") { + init.encodeResponseBody = cfReq.encodeResponseBody; + } + return ["request", req.url, init]; + } + case "response": { + let resp = value; + let body = this.devaluateImpl(resp.body, resp, depth + 1); + let init = {}; + if (resp.status !== 200) init.status = resp.status; + if (resp.statusText) init.statusText = resp.statusText; + let headers = [...resp.headers]; + if (headers.length > 0) { + init.headers = headers; + } + let cfResp = resp; + if (cfResp.cf) init.cf = cfResp.cf; + if (cfResp.encodeBody && cfResp.encodeBody !== "automatic") { + init.encodeBody = cfResp.encodeBody; + } + if (cfResp.webSocket) { + throw new TypeError("Can't serialize a Response containing a webSocket."); + } + return ["response", body, init]; + } + case "error": { + let e = value; + let rewritten = this.exporter.onSendError(e); + if (rewritten) { + e = rewritten; + } + let result = ["error", e.name, e.message]; + if (rewritten && rewritten.stack) { + result.push(rewritten.stack); + } + return result; + } + case "undefined": + return ["undefined"]; + case "stub": + case "rpc-promise": { + if (!this.source) { + throw new Error("Can't serialize RPC stubs in this context."); + } + let { hook, pathIfPromise } = unwrapStubAndPath(value); + let importId = this.exporter.getImport(hook); + if (importId !== void 0) { + if (pathIfPromise) { + if (pathIfPromise.length > 0) { + return ["pipeline", importId, pathIfPromise]; + } else { + return ["pipeline", importId]; + } + } else { + return ["import", importId]; + } + } + if (pathIfPromise) { + hook = hook.get(pathIfPromise); + } else { + hook = hook.dup(); + } + return this.devaluateHook(pathIfPromise ? "promise" : "export", hook); + } + case "function": + case "rpc-target": { + if (!this.source) { + throw new Error("Can't serialize RPC stubs in this context."); + } + let hook = this.source.getHookForRpcTarget(value, parent); + return this.devaluateHook("export", hook); + } + case "rpc-thenable": { + if (!this.source) { + throw new Error("Can't serialize RPC stubs in this context."); + } + let hook = this.source.getHookForRpcTarget(value, parent); + return this.devaluateHook("promise", hook); + } + case "writable": { + if (!this.source) { + throw new Error("Can't serialize WritableStream in this context."); + } + let hook = this.source.getHookForWritableStream(value, parent); + return this.devaluateHook("writable", hook); + } + case "readable": { + if (!this.source) { + throw new Error("Can't serialize ReadableStream in this context."); + } + let ws = value; + let hook = this.source.getHookForReadableStream(ws, parent); + let importId = this.exporter.createPipe(ws, hook); + return ["readable", importId]; + } + default: + throw new Error("unreachable"); + } + } + devaluateHook(type, hook) { + if (!this.exports) this.exports = []; + let exportId = type === "promise" ? this.exporter.exportPromise(hook) : this.exporter.exportStub(hook); + this.exports.push(exportId); + return [type, exportId]; + } +}; +var NullImporter = class { + static { + __name(this, "NullImporter"); + } + importStub(idx) { + throw new Error("Cannot deserialize RPC stubs without an RPC session."); + } + importPromise(idx) { + throw new Error("Cannot deserialize RPC stubs without an RPC session."); + } + getExport(idx) { + return void 0; + } + getPipeReadable(exportId) { + throw new Error("Cannot retrieve pipe readable without an RPC session."); + } +}; +var NULL_IMPORTER = new NullImporter(); +function fixBrokenRequestBody(request, body) { + let promise = new Response(body).arrayBuffer().then((arrayBuffer) => { + let bytes = new Uint8Array(arrayBuffer); + let result = new Request(request, { body: bytes }); + return new PayloadStubHook(RpcPayload.fromAppReturn(result)); + }); + return new RpcPromise(new PromiseStubHook(promise), []); +} +__name(fixBrokenRequestBody, "fixBrokenRequestBody"); +var Evaluator = class _Evaluator { + static { + __name(this, "_Evaluator"); + } + constructor(importer) { + this.importer = importer; + } + hooks = []; + promises = []; + evaluate(value) { + let payload = RpcPayload.forEvaluate(this.hooks, this.promises); + try { + payload.value = this.evaluateImpl(value, payload, "value"); + return payload; + } catch (err) { + payload.dispose(); + throw err; + } + } + // Evaluate the value without destroying it. + evaluateCopy(value) { + return this.evaluate(structuredClone(value)); + } + evaluateImpl(value, parent, property) { + if (value instanceof Array) { + if (value.length == 1 && value[0] instanceof Array) { + let result = value[0]; + for (let i = 0; i < result.length; i++) { + result[i] = this.evaluateImpl(result[i], result, i); + } + return result; + } else switch (value[0]) { + case "bigint": + if (typeof value[1] == "string") { + return BigInt(value[1]); + } + break; + case "date": + if (typeof value[1] == "number") { + return new Date(value[1]); + } + break; + case "bytes": { + let b64 = Uint8Array; + if (typeof value[1] == "string") { + if (b64.fromBase64) { + return b64.fromBase64(value[1]); + } else { + let bs = atob(value[1]); + let len = bs.length; + let bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = bs.charCodeAt(i); + } + return bytes; + } + } + break; + } + case "error": + if (value.length >= 3 && typeof value[1] === "string" && typeof value[2] === "string") { + let cls = ERROR_TYPES[value[1]] || Error; + let result = new cls(value[2]); + if (typeof value[3] === "string") { + result.stack = value[3]; + } + return result; + } + break; + case "undefined": + if (value.length === 1) { + return void 0; + } + break; + case "inf": + return Infinity; + case "-inf": + return -Infinity; + case "nan": + return NaN; + case "headers": + if (value.length === 2 && value[1] instanceof Array) { + return new Headers(value[1]); + } + break; + case "request": { + if (value.length !== 3 || typeof value[1] !== "string") break; + let url = value[1]; + let init = value[2]; + if (typeof init !== "object" || init === null) break; + if (init.body) { + init.body = this.evaluateImpl(init.body, init, "body"); + if (init.body === null || typeof init.body === "string" || init.body instanceof Uint8Array || init.body instanceof ReadableStream) ; + else { + throw new TypeError("Request body must be of type ReadableStream."); + } + } + if (init.signal) { + init.signal = this.evaluateImpl(init.signal, init, "signal"); + if (!(init.signal instanceof AbortSignal)) { + throw new TypeError("Request siganl must be of type AbortSignal."); + } + } + if (init.headers && !(init.headers instanceof Array)) { + throw new TypeError("Request headers must be serialized as an array of pairs."); + } + let result = new Request(url, init); + if (init.body instanceof ReadableStream && result.body === void 0) { + let promise = fixBrokenRequestBody(result, init.body); + this.promises.push({ promise, parent, property }); + return promise; + } else { + return result; + } + } + case "response": { + if (value.length !== 3) break; + let body = this.evaluateImpl(value[1], parent, property); + if (body === null || typeof body === "string" || body instanceof Uint8Array || body instanceof ReadableStream) ; + else { + throw new TypeError("Response body must be of type ReadableStream."); + } + let init = value[2]; + if (typeof init !== "object" || init === null) break; + if (init.webSocket) { + throw new TypeError("Can't deserialize a Response containing a webSocket."); + } + if (init.headers && !(init.headers instanceof Array)) { + throw new TypeError("Request headers must be serialized as an array of pairs."); + } + return new Response(body, init); + } + case "import": + case "pipeline": { + if (value.length < 2 || value.length > 4) { + break; + } + if (typeof value[1] != "number") { + break; + } + let hook = this.importer.getExport(value[1]); + if (!hook) { + throw new Error(`no such entry on exports table: ${value[1]}`); + } + let isPromise = value[0] == "pipeline"; + let addStub = /* @__PURE__ */ __name((hook2) => { + if (isPromise) { + let promise = new RpcPromise(hook2, []); + this.promises.push({ promise, parent, property }); + return promise; + } else { + this.hooks.push(hook2); + return new RpcPromise(hook2, []); + } + }, "addStub"); + if (value.length == 2) { + if (isPromise) { + return addStub(hook.get([])); + } else { + return addStub(hook.dup()); + } + } + let path = value[2]; + if (!(path instanceof Array)) { + break; + } + if (!path.every( + (part) => { + return typeof part == "string" || typeof part == "number"; + } + )) { + break; + } + if (value.length == 3) { + return addStub(hook.get(path)); + } + let args = value[3]; + if (!(args instanceof Array)) { + break; + } + let subEval = new _Evaluator(this.importer); + args = subEval.evaluate([args]); + return addStub(hook.call(path, args)); + } + case "remap": { + if (value.length !== 5 || typeof value[1] !== "number" || !(value[2] instanceof Array) || !(value[3] instanceof Array) || !(value[4] instanceof Array)) { + break; + } + let hook = this.importer.getExport(value[1]); + if (!hook) { + throw new Error(`no such entry on exports table: ${value[1]}`); + } + let path = value[2]; + if (!path.every( + (part) => { + return typeof part == "string" || typeof part == "number"; + } + )) { + break; + } + let captures = value[3].map((cap) => { + if (!(cap instanceof Array) || cap.length !== 2 || cap[0] !== "import" && cap[0] !== "export" || typeof cap[1] !== "number") { + throw new TypeError(`unknown map capture: ${JSON.stringify(cap)}`); + } + if (cap[0] === "export") { + return this.importer.importStub(cap[1]); + } else { + let exp = this.importer.getExport(cap[1]); + if (!exp) { + throw new Error(`no such entry on exports table: ${cap[1]}`); + } + return exp.dup(); + } + }); + let instructions = value[4]; + let resultHook = hook.map(path, captures, instructions); + let promise = new RpcPromise(resultHook, []); + this.promises.push({ promise, parent, property }); + return promise; + } + case "export": + case "promise": + if (typeof value[1] == "number") { + if (value[0] == "promise") { + let hook = this.importer.importPromise(value[1]); + let promise = new RpcPromise(hook, []); + this.promises.push({ parent, property, promise }); + return promise; + } else { + let hook = this.importer.importStub(value[1]); + this.hooks.push(hook); + return new RpcStub(hook); + } + } + break; + case "writable": + if (typeof value[1] == "number") { + let hook = this.importer.importStub(value[1]); + let stream = streamImpl.createWritableStreamFromHook(hook); + this.hooks.push(hook); + return stream; + } + break; + case "readable": + if (typeof value[1] == "number") { + let stream = this.importer.getPipeReadable(value[1]); + let hook = streamImpl.createReadableStreamHook(stream); + this.hooks.push(hook); + return stream; + } + break; + } + throw new TypeError(`unknown special value: ${JSON.stringify(value)}`); + } else if (value instanceof Object) { + let result = value; + for (let key in result) { + if (key in Object.prototype || key === "toJSON") { + this.evaluateImpl(result[key], result, key); + delete result[key]; + } else { + result[key] = this.evaluateImpl(result[key], result, key); + } + } + return result; + } else { + return value; + } + } +}; +var ImportTableEntry = class { + static { + __name(this, "ImportTableEntry"); + } + constructor(session, importId, pulling) { + this.session = session; + this.importId = importId; + if (pulling) { + this.activePull = Promise.withResolvers(); + } + } + localRefcount = 0; + remoteRefcount = 1; + activePull; + resolution; + // List of integer indexes into session.onBrokenCallbacks which are callbacks registered on + // this import. Initialized on first use (so `undefined` is the same as an empty list). + onBrokenRegistrations; + resolve(resolution) { + if (this.localRefcount == 0) { + resolution.dispose(); + return; + } + this.resolution = resolution; + this.sendRelease(); + if (this.onBrokenRegistrations) { + for (let i of this.onBrokenRegistrations) { + let callback = this.session.onBrokenCallbacks[i]; + let endIndex = this.session.onBrokenCallbacks.length; + resolution.onBroken(callback); + if (this.session.onBrokenCallbacks[endIndex] === callback) { + delete this.session.onBrokenCallbacks[endIndex]; + } else { + delete this.session.onBrokenCallbacks[i]; + } + } + this.onBrokenRegistrations = void 0; + } + if (this.activePull) { + this.activePull.resolve(); + this.activePull = void 0; + } + } + async awaitResolution() { + if (!this.activePull) { + this.session.sendPull(this.importId); + this.activePull = Promise.withResolvers(); + } + await this.activePull.promise; + return this.resolution.pull(); + } + dispose() { + if (this.resolution) { + this.resolution.dispose(); + } else { + this.abort(new Error("RPC was canceled because the RpcPromise was disposed.")); + this.sendRelease(); + } + } + abort(error) { + if (!this.resolution) { + this.resolution = new ErrorStubHook(error); + if (this.activePull) { + this.activePull.reject(error); + this.activePull = void 0; + } + this.onBrokenRegistrations = void 0; + } + } + onBroken(callback) { + if (this.resolution) { + this.resolution.onBroken(callback); + } else { + let index = this.session.onBrokenCallbacks.length; + this.session.onBrokenCallbacks.push(callback); + if (!this.onBrokenRegistrations) this.onBrokenRegistrations = []; + this.onBrokenRegistrations.push(index); + } + } + sendRelease() { + if (this.remoteRefcount > 0) { + this.session.sendRelease(this.importId, this.remoteRefcount); + this.remoteRefcount = 0; + } + } +}; +var RpcImportHook = class _RpcImportHook extends StubHook { + static { + __name(this, "_RpcImportHook"); + } + // undefined when we're disposed + // `pulling` is true if we already expect that this import is going to be resolved later, and + // null if this import is not allowed to be pulled (i.e. it's a stub not a promise). + constructor(isPromise, entry) { + super(); + this.isPromise = isPromise; + ++entry.localRefcount; + this.entry = entry; + } + entry; + collectPath(path) { + return this; + } + getEntry() { + if (this.entry) { + return this.entry; + } else { + throw new Error("This RpcImportHook was already disposed."); + } + } + // ------------------------------------------------------------------------------------- + // implements StubHook + call(path, args) { + let entry = this.getEntry(); + if (entry.resolution) { + return entry.resolution.call(path, args); + } else { + return entry.session.sendCall(entry.importId, path, args); + } + } + stream(path, args) { + let entry = this.getEntry(); + if (entry.resolution) { + return entry.resolution.stream(path, args); + } else { + return entry.session.sendStream(entry.importId, path, args); + } + } + map(path, captures, instructions) { + let entry; + try { + entry = this.getEntry(); + } catch (err) { + for (let cap of captures) { + cap.dispose(); + } + throw err; + } + if (entry.resolution) { + return entry.resolution.map(path, captures, instructions); + } else { + return entry.session.sendMap(entry.importId, path, captures, instructions); + } + } + get(path) { + let entry = this.getEntry(); + if (entry.resolution) { + return entry.resolution.get(path); + } else { + return entry.session.sendCall(entry.importId, path); + } + } + dup() { + return new _RpcImportHook(false, this.getEntry()); + } + pull() { + let entry = this.getEntry(); + if (!this.isPromise) { + throw new Error("Can't pull this hook because it's not a promise hook."); + } + if (entry.resolution) { + return entry.resolution.pull(); + } + return entry.awaitResolution(); + } + ignoreUnhandledRejections() { + } + dispose() { + let entry = this.entry; + this.entry = void 0; + if (entry) { + if (--entry.localRefcount === 0) { + entry.dispose(); + } + } + } + onBroken(callback) { + if (this.entry) { + this.entry.onBroken(callback); + } + } +}; +var RpcMainHook = class extends RpcImportHook { + static { + __name(this, "RpcMainHook"); + } + session; + constructor(entry) { + super(false, entry); + this.session = entry.session; + } + dispose() { + if (this.session) { + let session = this.session; + this.session = void 0; + session.shutdown(); + } + } +}; +var RpcSessionImpl = class { + static { + __name(this, "RpcSessionImpl"); + } + constructor(transport, mainHook, options) { + this.transport = transport; + this.options = options; + this.exports.push({ hook: mainHook, refcount: 1 }); + this.imports.push(new ImportTableEntry(this, 0, false)); + let rejectFunc; + let abortPromise = new Promise((resolve, reject) => { + rejectFunc = reject; + }); + this.cancelReadLoop = rejectFunc; + this.readLoop(abortPromise).catch((err) => this.abort(err)); + } + exports = []; + reverseExports = /* @__PURE__ */ new Map(); + imports = []; + abortReason; + cancelReadLoop; + // We assign positive numbers to imports we initiate, and negative numbers to exports we + // initiate. So the next import ID is just `imports.length`, but the next export ID needs + // to be tracked explicitly. + nextExportId = -1; + // If set, call this when all incoming calls are complete. + onBatchDone; + // How many promises is our peer expecting us to resolve? + pullCount = 0; + // Sparse array of onBrokenCallback registrations. Items are strictly appended to the end but + // may be deleted from the middle (hence leaving the array sparse). + onBrokenCallbacks = []; + // Should only be called once immediately after construction. + getMainImport() { + return new RpcMainHook(this.imports[0]); + } + shutdown() { + this.abort(new Error("RPC session was shut down by disposing the main stub"), false); + } + exportStub(hook) { + if (this.abortReason) throw this.abortReason; + let existingExportId = this.reverseExports.get(hook); + if (existingExportId !== void 0) { + ++this.exports[existingExportId].refcount; + return existingExportId; + } else { + let exportId = this.nextExportId--; + this.exports[exportId] = { hook, refcount: 1 }; + this.reverseExports.set(hook, exportId); + return exportId; + } + } + exportPromise(hook) { + if (this.abortReason) throw this.abortReason; + let exportId = this.nextExportId--; + this.exports[exportId] = { hook, refcount: 1 }; + this.reverseExports.set(hook, exportId); + this.ensureResolvingExport(exportId); + return exportId; + } + unexport(ids) { + for (let id of ids) { + this.releaseExport(id, 1); + } + } + releaseExport(exportId, refcount) { + let entry = this.exports[exportId]; + if (!entry) { + throw new Error(`no such export ID: ${exportId}`); + } + if (entry.refcount < refcount) { + throw new Error(`refcount would go negative: ${entry.refcount} < ${refcount}`); + } + entry.refcount -= refcount; + if (entry.refcount === 0) { + delete this.exports[exportId]; + this.reverseExports.delete(entry.hook); + entry.hook.dispose(); + } + } + onSendError(error) { + if (this.options.onSendError) { + return this.options.onSendError(error); + } + } + ensureResolvingExport(exportId) { + let exp = this.exports[exportId]; + if (!exp) { + throw new Error(`no such export ID: ${exportId}`); + } + if (!exp.pull) { + let resolve = /* @__PURE__ */ __name(async () => { + let hook = exp.hook; + for (; ; ) { + let payload = await hook.pull(); + if (payload.value instanceof RpcStub) { + let { hook: inner, pathIfPromise } = unwrapStubAndPath(payload.value); + if (pathIfPromise && pathIfPromise.length == 0) { + if (this.getImport(hook) === void 0) { + hook = inner; + continue; + } + } + } + return payload; + } + }, "resolve"); + let autoRelease = exp.autoRelease; + ++this.pullCount; + exp.pull = resolve().then( + (payload) => { + let value = Devaluator.devaluate(payload.value, void 0, this, payload); + this.send(["resolve", exportId, value]); + if (autoRelease) this.releaseExport(exportId, 1); + }, + (error) => { + this.send(["reject", exportId, Devaluator.devaluate(error, void 0, this)]); + if (autoRelease) this.releaseExport(exportId, 1); + } + ).catch( + (error) => { + try { + this.send(["reject", exportId, Devaluator.devaluate(error, void 0, this)]); + if (autoRelease) this.releaseExport(exportId, 1); + } catch (error2) { + this.abort(error2); + } + } + ).finally(() => { + if (--this.pullCount === 0) { + if (this.onBatchDone) { + this.onBatchDone.resolve(); + } + } + }); + } + } + getImport(hook) { + if (hook instanceof RpcImportHook && hook.entry && hook.entry.session === this) { + return hook.entry.importId; + } else { + return void 0; + } + } + importStub(idx) { + if (this.abortReason) throw this.abortReason; + let entry = this.imports[idx]; + if (!entry) { + entry = new ImportTableEntry(this, idx, false); + this.imports[idx] = entry; + } + return new RpcImportHook( + /*isPromise=*/ + false, + entry + ); + } + importPromise(idx) { + if (this.abortReason) throw this.abortReason; + if (this.imports[idx]) { + return new ErrorStubHook(new Error( + "Bug in RPC system: The peer sent a promise reusing an existing export ID." + )); + } + let entry = new ImportTableEntry(this, idx, true); + this.imports[idx] = entry; + return new RpcImportHook( + /*isPromise=*/ + true, + entry + ); + } + getExport(idx) { + return this.exports[idx]?.hook; + } + getPipeReadable(exportId) { + let entry = this.exports[exportId]; + if (!entry || !entry.pipeReadable) { + throw new Error(`Export ${exportId} is not a pipe or its readable end was already consumed.`); + } + let readable = entry.pipeReadable; + entry.pipeReadable = void 0; + return readable; + } + createPipe(readable, readableHook) { + if (this.abortReason) throw this.abortReason; + this.send(["pipe"]); + let importId = this.imports.length; + let entry = new ImportTableEntry(this, importId, false); + this.imports.push(entry); + let hook = new RpcImportHook( + /*isPromise=*/ + false, + entry + ); + let writable = streamImpl.createWritableStreamFromHook(hook); + readable.pipeTo(writable).catch(() => { + }).finally(() => readableHook.dispose()); + return importId; + } + // Serializes and sends a message. Returns the byte length of the serialized message. + send(msg) { + if (this.abortReason !== void 0) { + return 0; + } + let msgText; + try { + msgText = JSON.stringify(msg); + } catch (err) { + try { + this.abort(err); + } catch (err2) { + } + throw err; + } + this.transport.send(msgText).catch((err) => this.abort(err, false)); + return msgText.length; + } + sendCall(id, path, args) { + if (this.abortReason) throw this.abortReason; + let value = ["pipeline", id, path]; + if (args) { + let devalue = Devaluator.devaluate(args.value, void 0, this, args); + value.push(devalue[0]); + } + this.send(["push", value]); + let entry = new ImportTableEntry(this, this.imports.length, false); + this.imports.push(entry); + return new RpcImportHook( + /*isPromise=*/ + true, + entry + ); + } + sendStream(id, path, args) { + if (this.abortReason) throw this.abortReason; + let value = ["pipeline", id, path]; + let devalue = Devaluator.devaluate(args.value, void 0, this, args); + value.push(devalue[0]); + let size = this.send(["stream", value]); + let importId = this.imports.length; + let entry = new ImportTableEntry( + this, + importId, + /*pulling=*/ + true + ); + entry.remoteRefcount = 0; + entry.localRefcount = 1; + this.imports.push(entry); + let promise = entry.awaitResolution().then( + (p) => { + p.dispose(); + delete this.imports[importId]; + }, + (err) => { + delete this.imports[importId]; + throw err; + } + ); + return { promise, size }; + } + sendMap(id, path, captures, instructions) { + if (this.abortReason) { + for (let cap of captures) { + cap.dispose(); + } + throw this.abortReason; + } + let devaluedCaptures = captures.map((hook) => { + let importId = this.getImport(hook); + if (importId !== void 0) { + return ["import", importId]; + } else { + return ["export", this.exportStub(hook)]; + } + }); + let value = ["remap", id, path, devaluedCaptures, instructions]; + this.send(["push", value]); + let entry = new ImportTableEntry(this, this.imports.length, false); + this.imports.push(entry); + return new RpcImportHook( + /*isPromise=*/ + true, + entry + ); + } + sendPull(id) { + if (this.abortReason) throw this.abortReason; + this.send(["pull", id]); + } + sendRelease(id, remoteRefcount) { + if (this.abortReason) return; + this.send(["release", id, remoteRefcount]); + delete this.imports[id]; + } + abort(error, trySendAbortMessage = true) { + if (this.abortReason !== void 0) return; + this.cancelReadLoop(error); + if (trySendAbortMessage) { + try { + this.transport.send(JSON.stringify(["abort", Devaluator.devaluate(error, void 0, this)])).catch((err) => { + }); + } catch (err) { + } + } + if (error === void 0) { + error = "undefined"; + } + this.abortReason = error; + if (this.onBatchDone) { + this.onBatchDone.reject(error); + } + if (this.transport.abort) { + try { + this.transport.abort(error); + } catch (err) { + Promise.resolve(err); + } + } + for (let i in this.onBrokenCallbacks) { + try { + this.onBrokenCallbacks[i](error); + } catch (err) { + Promise.resolve(err); + } + } + for (let i in this.imports) { + this.imports[i].abort(error); + } + for (let i in this.exports) { + this.exports[i].hook.dispose(); + } + } + async readLoop(abortPromise) { + while (!this.abortReason) { + let msg = JSON.parse(await Promise.race([this.transport.receive(), abortPromise])); + if (this.abortReason) break; + if (msg instanceof Array) { + switch (msg[0]) { + case "push": + if (msg.length > 1) { + let payload = new Evaluator(this).evaluate(msg[1]); + let hook = new PayloadStubHook(payload); + hook.ignoreUnhandledRejections(); + this.exports.push({ hook, refcount: 1 }); + continue; + } + break; + case "stream": { + if (msg.length > 1) { + let payload = new Evaluator(this).evaluate(msg[1]); + let hook = new PayloadStubHook(payload); + hook.ignoreUnhandledRejections(); + let exportId = this.exports.length; + this.exports.push({ hook, refcount: 1, autoRelease: true }); + this.ensureResolvingExport(exportId); + continue; + } + break; + } + case "pipe": { + let { readable, writable } = new TransformStream(); + let hook = streamImpl.createWritableStreamHook(writable); + this.exports.push({ hook, refcount: 1, pipeReadable: readable }); + continue; + } + case "pull": { + let exportId = msg[1]; + if (typeof exportId == "number") { + this.ensureResolvingExport(exportId); + continue; + } + break; + } + case "resolve": + // ["resolve", ExportId, Expression] + case "reject": { + let importId = msg[1]; + if (typeof importId == "number" && msg.length > 2) { + let imp = this.imports[importId]; + if (imp) { + if (msg[0] == "resolve") { + imp.resolve(new PayloadStubHook(new Evaluator(this).evaluate(msg[2]))); + } else { + let payload = new Evaluator(this).evaluate(msg[2]); + payload.dispose(); + imp.resolve(new ErrorStubHook(payload.value)); + } + } else { + if (msg[0] == "resolve") { + new Evaluator(this).evaluate(msg[2]).dispose(); + } + } + continue; + } + break; + } + case "release": { + let exportId = msg[1]; + let refcount = msg[2]; + if (typeof exportId == "number" && typeof refcount == "number") { + this.releaseExport(exportId, refcount); + continue; + } + break; + } + case "abort": { + let payload = new Evaluator(this).evaluate(msg[1]); + payload.dispose(); + this.abort(payload, false); + break; + } + } + } + throw new Error(`bad RPC message: ${JSON.stringify(msg)}`); + } + } + async drain() { + if (this.abortReason) { + throw this.abortReason; + } + if (this.pullCount > 0) { + let { promise, resolve, reject } = Promise.withResolvers(); + this.onBatchDone = { resolve, reject }; + await promise; + } + } + getStats() { + let result = { imports: 0, exports: 0 }; + for (let i in this.imports) { + ++result.imports; + } + for (let i in this.exports) { + ++result.exports; + } + return result; + } +}; +var RpcSession = class { + static { + __name(this, "RpcSession"); + } + #session; + #mainStub; + constructor(transport, localMain, options = {}) { + let mainHook; + if (localMain) { + mainHook = new PayloadStubHook(RpcPayload.fromAppReturn(localMain)); + } else { + mainHook = new ErrorStubHook(new Error("This connection has no main object.")); + } + this.#session = new RpcSessionImpl(transport, mainHook, options); + this.#mainStub = new RpcStub(this.#session.getMainImport()); + } + getRemoteMain() { + return this.#mainStub; + } + getStats() { + return this.#session.getStats(); + } + drain() { + return this.#session.drain(); + } +}; +function newWebSocketRpcSession(webSocket, localMain, options) { + if (typeof webSocket === "string") { + webSocket = new WebSocket(webSocket); + } + let transport = new WebSocketTransport(webSocket); + let rpc = new RpcSession(transport, localMain, options); + return rpc.getRemoteMain(); +} +__name(newWebSocketRpcSession, "newWebSocketRpcSession"); +function newWorkersWebSocketRpcResponse(request, localMain, options) { + if (request.headers.get("Upgrade")?.toLowerCase() !== "websocket") { + return new Response("This endpoint only accepts WebSocket requests.", { status: 400 }); + } + let pair = new WebSocketPair(); + let server = pair[0]; + server.accept(); + newWebSocketRpcSession(server, localMain, options); + return new Response(null, { + status: 101, + webSocket: pair[1] + }); +} +__name(newWorkersWebSocketRpcResponse, "newWorkersWebSocketRpcResponse"); +var WebSocketTransport = class { + static { + __name(this, "WebSocketTransport"); + } + constructor(webSocket) { + this.#webSocket = webSocket; + if (webSocket.readyState === WebSocket.CONNECTING) { + this.#sendQueue = []; + webSocket.addEventListener("open", (event) => { + try { + for (let message of this.#sendQueue) { + webSocket.send(message); + } + } catch (err) { + this.#receivedError(err); + } + this.#sendQueue = void 0; + }); + } + webSocket.addEventListener("message", (event) => { + if (this.#error) ; + else if (typeof event.data === "string") { + if (this.#receiveResolver) { + this.#receiveResolver(event.data); + this.#receiveResolver = void 0; + this.#receiveRejecter = void 0; + } else { + this.#receiveQueue.push(event.data); + } + } else { + this.#receivedError(new TypeError("Received non-string message from WebSocket.")); + } + }); + webSocket.addEventListener("close", (event) => { + this.#receivedError(new Error(`Peer closed WebSocket: ${event.code} ${event.reason}`)); + }); + webSocket.addEventListener("error", (event) => { + this.#receivedError(new Error(`WebSocket connection failed.`)); + }); + } + #webSocket; + #sendQueue; + // only if not opened yet + #receiveResolver; + #receiveRejecter; + #receiveQueue = []; + #error; + async send(message) { + if (this.#sendQueue === void 0) { + this.#webSocket.send(message); + } else { + this.#sendQueue.push(message); + } + } + async receive() { + if (this.#receiveQueue.length > 0) { + return this.#receiveQueue.shift(); + } else if (this.#error) { + throw this.#error; + } else { + return new Promise((resolve, reject) => { + this.#receiveResolver = resolve; + this.#receiveRejecter = reject; + }); + } + } + abort(reason) { + let message; + if (reason instanceof Error) { + message = reason.message; + } else { + message = `${reason}`; + } + this.#webSocket.close(3e3, message); + if (!this.#error) { + this.#error = reason; + } + } + #receivedError(reason) { + if (!this.#error) { + this.#error = reason; + if (this.#receiveRejecter) { + this.#receiveRejecter(reason); + this.#receiveResolver = void 0; + this.#receiveRejecter = void 0; + } + } + } +}; +var BatchServerTransport = class { + static { + __name(this, "BatchServerTransport"); + } + constructor(batch) { + this.#batchToReceive = batch; + } + #batchToSend = []; + #batchToReceive; + #allReceived = Promise.withResolvers(); + async send(message) { + this.#batchToSend.push(message); + } + async receive() { + let msg = this.#batchToReceive.shift(); + if (msg !== void 0) { + return msg; + } else { + this.#allReceived.resolve(); + return new Promise((r) => { + }); + } + } + abort(reason) { + this.#allReceived.reject(reason); + } + whenAllReceived() { + return this.#allReceived.promise; + } + getResponseBody() { + return this.#batchToSend.join("\n"); + } +}; +async function newHttpBatchRpcResponse(request, localMain, options) { + if (request.method !== "POST") { + return new Response("This endpoint only accepts POST requests.", { status: 405 }); + } + let body = await request.text(); + let batch = body === "" ? [] : body.split("\n"); + let transport = new BatchServerTransport(batch); + let rpc = new RpcSession(transport, localMain, options); + await transport.whenAllReceived(); + await rpc.drain(); + return new Response(transport.getResponseBody()); +} +__name(newHttpBatchRpcResponse, "newHttpBatchRpcResponse"); +var currentMapBuilder; +var MapBuilder = class { + static { + __name(this, "MapBuilder"); + } + context; + captureMap = /* @__PURE__ */ new Map(); + instructions = []; + constructor(subject, path) { + if (currentMapBuilder) { + this.context = { + parent: currentMapBuilder, + captures: [], + subject: currentMapBuilder.capture(subject), + path + }; + } else { + this.context = { + parent: void 0, + captures: [], + subject, + path + }; + } + currentMapBuilder = this; + } + unregister() { + currentMapBuilder = this.context.parent; + } + makeInput() { + return new MapVariableHook(this, 0); + } + makeOutput(result) { + let devalued; + try { + devalued = Devaluator.devaluate(result.value, void 0, this, result); + } finally { + result.dispose(); + } + this.instructions.push(devalued); + if (this.context.parent) { + this.context.parent.instructions.push( + [ + "remap", + this.context.subject, + this.context.path, + this.context.captures.map((cap) => ["import", cap]), + this.instructions + ] + ); + return new MapVariableHook(this.context.parent, this.context.parent.instructions.length); + } else { + return this.context.subject.map(this.context.path, this.context.captures, this.instructions); + } + } + pushCall(hook, path, params) { + let devalued = Devaluator.devaluate(params.value, void 0, this, params); + devalued = devalued[0]; + let subject = this.capture(hook.dup()); + this.instructions.push(["pipeline", subject, path, devalued]); + return new MapVariableHook(this, this.instructions.length); + } + pushGet(hook, path) { + let subject = this.capture(hook.dup()); + this.instructions.push(["pipeline", subject, path]); + return new MapVariableHook(this, this.instructions.length); + } + capture(hook) { + if (hook instanceof MapVariableHook && hook.mapper === this) { + return hook.idx; + } + let result = this.captureMap.get(hook); + if (result === void 0) { + if (this.context.parent) { + let parentIdx = this.context.parent.capture(hook); + this.context.captures.push(parentIdx); + } else { + this.context.captures.push(hook); + } + result = -this.context.captures.length; + this.captureMap.set(hook, result); + } + return result; + } + // --------------------------------------------------------------------------- + // implements Exporter + exportStub(hook) { + throw new Error( + "Can't construct an RpcTarget or RPC callback inside a mapper function. Try creating a new RpcStub outside the callback first, then using it inside the callback." + ); + } + exportPromise(hook) { + return this.exportStub(hook); + } + getImport(hook) { + return this.capture(hook); + } + unexport(ids) { + } + createPipe(readable) { + throw new Error("Cannot send ReadableStream inside a mapper function."); + } + onSendError(error) { + } +}; +mapImpl.sendMap = (hook, path, func) => { + let builder = new MapBuilder(hook, path); + let result; + try { + result = RpcPayload.fromAppReturn(withCallInterceptor(builder.pushCall.bind(builder), () => { + return func(new RpcPromise(builder.makeInput(), [])); + })); + } finally { + builder.unregister(); + } + if (result instanceof Promise) { + result.catch((err) => { + }); + throw new Error("RPC map() callbacks cannot be async."); + } + return new RpcPromise(builder.makeOutput(result), []); +}; +function throwMapperBuilderUseError() { + throw new Error( + "Attempted to use an abstract placeholder from a mapper function. Please make sure your map function has no side effects." + ); +} +__name(throwMapperBuilderUseError, "throwMapperBuilderUseError"); +var MapVariableHook = class extends StubHook { + static { + __name(this, "MapVariableHook"); + } + constructor(mapper, idx) { + super(); + this.mapper = mapper; + this.idx = idx; + } + // We don't have anything we actually need to dispose, so dup() can just return the same hook. + dup() { + return this; + } + dispose() { + } + get(path) { + if (path.length == 0) { + return this; + } else if (currentMapBuilder) { + return currentMapBuilder.pushGet(this, path); + } else { + throwMapperBuilderUseError(); + } + } + // Other methods should never be called. + call(path, args) { + throwMapperBuilderUseError(); + } + map(path, captures, instructions) { + throwMapperBuilderUseError(); + } + pull() { + throwMapperBuilderUseError(); + } + ignoreUnhandledRejections() { + } + onBroken(callback) { + throwMapperBuilderUseError(); + } +}; +var MapApplicator = class { + static { + __name(this, "MapApplicator"); + } + constructor(captures, input) { + this.captures = captures; + this.variables = [input]; + } + variables; + dispose() { + for (let variable of this.variables) { + variable.dispose(); + } + } + apply(instructions) { + try { + if (instructions.length < 1) { + throw new Error("Invalid empty mapper function."); + } + for (let instruction of instructions.slice(0, -1)) { + let payload = new Evaluator(this).evaluateCopy(instruction); + if (payload.value instanceof RpcStub) { + let hook = unwrapStubNoProperties(payload.value); + if (hook) { + this.variables.push(hook); + continue; + } + } + this.variables.push(new PayloadStubHook(payload)); + } + return new Evaluator(this).evaluateCopy(instructions[instructions.length - 1]); + } finally { + for (let variable of this.variables) { + variable.dispose(); + } + } + } + importStub(idx) { + throw new Error("A mapper function cannot refer to exports."); + } + importPromise(idx) { + return this.importStub(idx); + } + getExport(idx) { + if (idx < 0) { + return this.captures[-idx - 1]; + } else { + return this.variables[idx]; + } + } + getPipeReadable(exportId) { + throw new Error("A mapper function cannot use pipe readables."); + } +}; +function applyMapToElement(input, parent, owner, captures, instructions) { + let inputHook = new PayloadStubHook(RpcPayload.deepCopyFrom(input, parent, owner)); + let mapper = new MapApplicator(captures, inputHook); + try { + return mapper.apply(instructions); + } finally { + mapper.dispose(); + } +} +__name(applyMapToElement, "applyMapToElement"); +mapImpl.applyMap = (input, parent, owner, captures, instructions) => { + try { + let result; + if (input instanceof RpcPromise) { + throw new Error("applyMap() can't be called on RpcPromise"); + } else if (input instanceof Array) { + let payloads = []; + try { + for (let elem of input) { + payloads.push(applyMapToElement(elem, input, owner, captures, instructions)); + } + } catch (err) { + for (let payload of payloads) { + payload.dispose(); + } + throw err; + } + result = RpcPayload.fromArray(payloads); + } else if (input === null || input === void 0) { + result = RpcPayload.fromAppReturn(input); + } else { + result = applyMapToElement(input, parent, owner, captures, instructions); + } + return new PayloadStubHook(result); + } finally { + for (let cap of captures) { + cap.dispose(); + } + } +}; +var WritableStreamStubHook = class _WritableStreamStubHook extends StubHook { + static { + __name(this, "_WritableStreamStubHook"); + } + state; + // undefined when disposed + // Creates a new WritableStreamStubHook that is not duplicated from an existing hook. + static create(stream) { + let writer = stream.getWriter(); + return new _WritableStreamStubHook({ refcount: 1, writer, closed: false }); + } + constructor(state, dupFrom) { + super(); + this.state = state; + if (dupFrom) { + ++state.refcount; + } + } + getState() { + if (this.state) { + return this.state; + } else { + throw new Error("Attempted to use a WritableStreamStubHook after it was disposed."); + } + } + call(path, args) { + try { + let state = this.getState(); + if (path.length !== 1 || typeof path[0] !== "string") { + throw new Error("WritableStream stub only supports direct method calls"); + } + const method = path[0]; + if (method !== "write" && method !== "close" && method !== "abort") { + args.dispose(); + throw new Error(`Unknown WritableStream method: ${method}`); + } + if (method === "close" || method === "abort") { + state.closed = true; + } + let func = state.writer[method]; + let promise = args.deliverCall(func, state.writer); + return new PromiseStubHook(promise.then((payload) => new PayloadStubHook(payload))); + } catch (err) { + return new ErrorStubHook(err); + } + } + map(path, captures, instructions) { + for (let cap of captures) { + cap.dispose(); + } + return new ErrorStubHook(new Error("Cannot use map() on a WritableStream")); + } + get(path) { + return new ErrorStubHook(new Error("Cannot access properties on a WritableStream stub")); + } + dup() { + let state = this.getState(); + return new _WritableStreamStubHook(state, this); + } + pull() { + return Promise.reject(new Error("Cannot pull a WritableStream stub")); + } + ignoreUnhandledRejections() { + } + dispose() { + let state = this.state; + this.state = void 0; + if (state) { + if (--state.refcount === 0) { + if (!state.closed) { + state.writer.abort(new Error("WritableStream RPC stub was disposed without calling close()")).catch(() => { + }); + } + state.writer.releaseLock(); + } + } + } + onBroken(callback) { + } +}; +var INITIAL_WINDOW = 256 * 1024; +var MAX_WINDOW = 1024 * 1024 * 1024; +var MIN_WINDOW = 64 * 1024; +var STARTUP_GROWTH_FACTOR = 2; +var STEADY_GROWTH_FACTOR = 1.25; +var DECAY_FACTOR = 0.9; +var STARTUP_EXIT_ROUNDS = 3; +var FlowController = class { + static { + __name(this, "FlowController"); + } + constructor(now) { + this.now = now; + } + // The current window size in bytes. The sender blocks when bytesInFlight >= window. + window = INITIAL_WINDOW; + // Total bytes currently in flight (sent but not yet acked). + bytesInFlight = 0; + // Whether we're still in the startup phase. + inStartupPhase = true; + // ----- BDP estimation state (private) ----- + // Total bytes acked so far. + delivered = 0; + // Time of most recent ack. + deliveredTime = 0; + // Time when the very first ack was received. + firstAckTime = 0; + firstAckDelivered = 0; + // Global minimum RTT observed (milliseconds). + minRtt = Infinity; + // For startup exit: count of consecutive RTT rounds where the window didn't meaningfully grow. + roundsWithoutIncrease = 0; + // Window size at the start of the current round, for startup exit detection. + lastRoundWindow = 0; + // Time when the current round started. + roundStartTime = 0; + // Called when a write of `size` bytes is about to be sent. Returns a token that must be + // passed to onAck() when the ack arrives, and whether the sender should block (window full). + onSend(size) { + this.bytesInFlight += size; + let token = { + sentTime: this.now(), + size, + deliveredAtSend: this.delivered, + deliveredTimeAtSend: this.deliveredTime, + windowAtSend: this.window, + windowFullAtSend: this.bytesInFlight >= this.window + }; + return { token, shouldBlock: token.windowFullAtSend }; + } + // Called when a previously-sent write fails. Restores bytesInFlight without updating + // any BDP estimates. + onError(token) { + this.bytesInFlight -= token.size; + } + // Called when an ack is received for a previously-sent write. Updates BDP estimates and + // the window. Returns whether a blocked sender should now unblock. + onAck(token) { + let ackTime = this.now(); + this.delivered += token.size; + this.deliveredTime = ackTime; + this.bytesInFlight -= token.size; + let rtt = ackTime - token.sentTime; + this.minRtt = Math.min(this.minRtt, rtt); + if (this.firstAckTime === 0) { + this.firstAckTime = ackTime; + this.firstAckDelivered = this.delivered; + } else { + let baseTime; + let baseDelivered; + if (token.deliveredTimeAtSend === 0) { + baseTime = this.firstAckTime; + baseDelivered = this.firstAckDelivered; + } else { + baseTime = token.deliveredTimeAtSend; + baseDelivered = token.deliveredAtSend; + } + let interval = ackTime - baseTime; + let bytes = this.delivered - baseDelivered; + let bandwidth = bytes / interval; + let growthFactor = this.inStartupPhase ? STARTUP_GROWTH_FACTOR : STEADY_GROWTH_FACTOR; + let newWindow = bandwidth * this.minRtt * growthFactor; + newWindow = Math.min(newWindow, token.windowAtSend * growthFactor); + if (token.windowFullAtSend) { + newWindow = Math.max(newWindow, token.windowAtSend * DECAY_FACTOR); + } else { + newWindow = Math.max(newWindow, this.window); + } + this.window = Math.max(Math.min(newWindow, MAX_WINDOW), MIN_WINDOW); + if (this.inStartupPhase && token.sentTime >= this.roundStartTime) { + if (this.window > this.lastRoundWindow * STEADY_GROWTH_FACTOR) { + this.roundsWithoutIncrease = 0; + } else { + if (++this.roundsWithoutIncrease >= STARTUP_EXIT_ROUNDS) { + this.inStartupPhase = false; + } + } + this.roundStartTime = ackTime; + this.lastRoundWindow = this.window; + } + } + return this.bytesInFlight < this.window; + } +}; +function createWritableStreamFromHook(hook) { + let pendingError = void 0; + let hookDisposed = false; + let fc = new FlowController(() => performance.now()); + let windowResolve; + let windowReject; + const disposeHook = /* @__PURE__ */ __name(() => { + if (!hookDisposed) { + hookDisposed = true; + hook.dispose(); + } + }, "disposeHook"); + return new WritableStream({ + write(chunk, controller) { + if (pendingError !== void 0) { + throw pendingError; + } + const payload = RpcPayload.fromAppParams([chunk]); + const { promise, size } = hook.stream(["write"], payload); + if (size === void 0) { + return promise.catch((err) => { + if (pendingError === void 0) { + pendingError = err; + } + throw err; + }); + } else { + let { token, shouldBlock } = fc.onSend(size); + promise.then(() => { + let hasCapacity = fc.onAck(token); + if (hasCapacity && windowResolve) { + windowResolve(); + windowResolve = void 0; + windowReject = void 0; + } + }, (err) => { + fc.onError(token); + if (pendingError === void 0) { + pendingError = err; + controller.error(err); + disposeHook(); + } + if (windowReject) { + windowReject(err); + windowResolve = void 0; + windowReject = void 0; + } + }); + if (shouldBlock) { + return new Promise((resolve, reject) => { + windowResolve = resolve; + windowReject = reject; + }); + } + } + }, + async close() { + if (pendingError !== void 0) { + disposeHook(); + throw pendingError; + } + const { promise } = hook.stream(["close"], RpcPayload.fromAppParams([])); + try { + await promise; + } catch (err) { + throw pendingError ?? err; + } finally { + disposeHook(); + } + }, + abort(reason) { + if (pendingError !== void 0) { + return; + } + pendingError = reason ?? new Error("WritableStream was aborted"); + if (windowReject) { + windowReject(pendingError); + windowResolve = void 0; + windowReject = void 0; + } + const { promise } = hook.stream(["abort"], RpcPayload.fromAppParams([reason])); + promise.then(() => disposeHook(), () => disposeHook()); + } + }); +} +__name(createWritableStreamFromHook, "createWritableStreamFromHook"); +var ReadableStreamStubHook = class _ReadableStreamStubHook extends StubHook { + static { + __name(this, "_ReadableStreamStubHook"); + } + state; + // undefined when disposed + // Creates a new ReadableStreamStubHook. + static create(stream) { + return new _ReadableStreamStubHook({ refcount: 1, stream, canceled: false }); + } + constructor(state, dupFrom) { + super(); + this.state = state; + if (dupFrom) { + ++state.refcount; + } + } + call(path, args) { + args.dispose(); + return new ErrorStubHook(new Error("Cannot call methods on a ReadableStream stub")); + } + map(path, captures, instructions) { + for (let cap of captures) { + cap.dispose(); + } + return new ErrorStubHook(new Error("Cannot use map() on a ReadableStream")); + } + get(path) { + return new ErrorStubHook(new Error("Cannot access properties on a ReadableStream stub")); + } + dup() { + let state = this.state; + if (!state) { + throw new Error("Attempted to dup a ReadableStreamStubHook after it was disposed."); + } + return new _ReadableStreamStubHook(state, this); + } + pull() { + return Promise.reject(new Error("Cannot pull a ReadableStream stub")); + } + ignoreUnhandledRejections() { + } + dispose() { + let state = this.state; + this.state = void 0; + if (state) { + if (--state.refcount === 0) { + if (!state.canceled) { + state.canceled = true; + if (!state.stream.locked) { + state.stream.cancel( + new Error("ReadableStream RPC stub was disposed without being consumed") + ).catch(() => { + }); + } + } + } + } + } + onBroken(callback) { + } +}; +streamImpl.createWritableStreamHook = WritableStreamStubHook.create; +streamImpl.createWritableStreamFromHook = createWritableStreamFromHook; +streamImpl.createReadableStreamHook = ReadableStreamStubHook.create; +async function newWorkersRpcResponse(request, localMain) { + if (request.method === "POST") { + let response = await newHttpBatchRpcResponse(request, localMain); + response.headers.set("Access-Control-Allow-Origin", "*"); + return response; + } else if (request.headers.get("Upgrade")?.toLowerCase() === "websocket") { + return newWorkersWebSocketRpcResponse(request, localMain); + } else { + return new Response("This endpoint only accepts POST or WebSocket requests.", { status: 400 }); + } +} +__name(newWorkersRpcResponse, "newWorkersRpcResponse"); +var BindingNotFoundError = class extends Error { + static { + __name(this, "BindingNotFoundError"); + } + constructor(name) { + super(`Binding ${name ? `"${name}"` : ""} not found`); + } +}; +function getExposedJSRPCBinding(request, env) { + const url = new URL(request.url); + const bindingName = url.searchParams.get("MF-Binding"); + if (!bindingName) { + throw new BindingNotFoundError(); + } + const targetBinding = env[bindingName]; + if (!targetBinding) { + throw new BindingNotFoundError(bindingName); + } + if (targetBinding.constructor.name === "SendEmail") { + return { + async send(e) { + if ("EmailMessage::raw" in e) { + const message = new EmailMessage( + e.from, + e.to, + e["EmailMessage::raw"] + ); + return targetBinding.send(message); + } else { + return targetBinding.send(e); + } + } + }; + } + if (url.searchParams.has("MF-Dispatch-Namespace-Options")) { + const { name, args, options } = JSON.parse( + url.searchParams.get("MF-Dispatch-Namespace-Options") + ); + return targetBinding.get(name, args, options); + } + return targetBinding; +} +__name(getExposedJSRPCBinding, "getExposedJSRPCBinding"); +function getExposedFetcher(request, env) { + const bindingName = request.headers.get("MF-Binding"); + if (!bindingName) { + throw new BindingNotFoundError(); + } + const targetBinding = env[bindingName]; + if (!targetBinding) { + throw new BindingNotFoundError(bindingName); + } + const dispatchNamespaceOptions = request.headers.get( + "MF-Dispatch-Namespace-Options" + ); + if (dispatchNamespaceOptions) { + const { name, args, options } = JSON.parse(dispatchNamespaceOptions); + return targetBinding.get(name, args, options); + } + return targetBinding; +} +__name(getExposedFetcher, "getExposedFetcher"); +function isJSRPCBinding(request) { + const url = new URL(request.url); + return request.headers.has("Upgrade") && url.searchParams.has("MF-Binding"); +} +__name(isJSRPCBinding, "isJSRPCBinding"); +var ProxyServerWorker_default = { + async fetch(request, env) { + try { + if (isJSRPCBinding(request)) { + return newWorkersRpcResponse( + request, + getExposedJSRPCBinding(request, env) + ); + } else { + const fetcher = getExposedFetcher(request, env); + const originalHeaders = new Headers(); + for (const [name, value] of request.headers) { + if (name.startsWith("mf-header-")) { + originalHeaders.set(name.slice("mf-header-".length), value); + } else if (name === "upgrade") { + originalHeaders.set(name, value); + } + } + return fetcher.fetch( + request.headers.get("MF-URL") ?? "http://example.com", + new Request(request, { + redirect: "manual", + headers: originalHeaders + }) + ); + } + } catch (e) { + if (e instanceof BindingNotFoundError) { + return new Response(e.message, { status: 400 }); + } + return new Response(e.message, { status: 500 }); + } + } +}; + +// node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts +var drainBody = /* @__PURE__ */ __name(async (request, env, _ctx, middlewareCtx) => { + try { + return await middlewareCtx.next(request, env); + } finally { + try { + if (request.body !== null && !request.bodyUsed) { + const reader = request.body.getReader(); + while (!(await reader.read()).done) { + } + } + } catch (e) { + console.error("Failed to drain the unused request body.", e); + } + } +}, "drainBody"); +var middleware_ensure_req_body_drained_default = drainBody; + +// .wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js +var __INTERNAL_WRANGLER_MIDDLEWARE__ = [ + middleware_ensure_req_body_drained_default +]; +var middleware_insertion_facade_default = ProxyServerWorker_default; + +// node_modules/wrangler/templates/middleware/common.ts +var __facade_middleware__ = []; +function __facade_register__(...args) { + __facade_middleware__.push(...args.flat()); +} +__name(__facade_register__, "__facade_register__"); +function __facade_invokeChain__(request, env, ctx, dispatch, middlewareChain) { + const [head, ...tail] = middlewareChain; + const middlewareCtx = { + dispatch, + next(newRequest, newEnv) { + return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail); + } + }; + return head(request, env, ctx, middlewareCtx); +} +__name(__facade_invokeChain__, "__facade_invokeChain__"); +function __facade_invoke__(request, env, ctx, dispatch, finalMiddleware) { + return __facade_invokeChain__(request, env, ctx, dispatch, [ + ...__facade_middleware__, + finalMiddleware + ]); +} +__name(__facade_invoke__, "__facade_invoke__"); + +// .wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts +var __Facade_ScheduledController__ = class ___Facade_ScheduledController__ { + constructor(scheduledTime, cron, noRetry) { + this.scheduledTime = scheduledTime; + this.cron = cron; + this.#noRetry = noRetry; + } + static { + __name(this, "__Facade_ScheduledController__"); + } + #noRetry; + noRetry() { + if (!(this instanceof ___Facade_ScheduledController__)) { + throw new TypeError("Illegal invocation"); + } + this.#noRetry(); + } +}; +function wrapExportedHandler(worker) { + if (__INTERNAL_WRANGLER_MIDDLEWARE__ === void 0 || __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0) { + return worker; + } + for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { + __facade_register__(middleware); + } + const fetchDispatcher = /* @__PURE__ */ __name(function(request, env, ctx) { + if (worker.fetch === void 0) { + throw new Error("Handler does not export a fetch() function."); + } + return worker.fetch(request, env, ctx); + }, "fetchDispatcher"); + return { + ...worker, + fetch(request, env, ctx) { + const dispatcher = /* @__PURE__ */ __name(function(type, init) { + if (type === "scheduled" && worker.scheduled !== void 0) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => { + } + ); + return worker.scheduled(controller, env, ctx); + } + }, "dispatcher"); + return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher); + } + }; +} +__name(wrapExportedHandler, "wrapExportedHandler"); +function wrapWorkerEntrypoint(klass) { + if (__INTERNAL_WRANGLER_MIDDLEWARE__ === void 0 || __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0) { + return klass; + } + for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { + __facade_register__(middleware); + } + return class extends klass { + #fetchDispatcher = /* @__PURE__ */ __name((request, env, ctx) => { + this.env = env; + this.ctx = ctx; + if (super.fetch === void 0) { + throw new Error("Entrypoint class does not define a fetch() function."); + } + return super.fetch(request); + }, "#fetchDispatcher"); + #dispatcher = /* @__PURE__ */ __name((type, init) => { + if (type === "scheduled" && super.scheduled !== void 0) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => { + } + ); + return super.scheduled(controller); + } + }, "#dispatcher"); + fetch(request) { + return __facade_invoke__( + request, + this.env, + this.ctx, + this.#dispatcher, + this.#fetchDispatcher + ); + } + }; +} +__name(wrapWorkerEntrypoint, "wrapWorkerEntrypoint"); +var WRAPPED_ENTRY; +if (typeof middleware_insertion_facade_default === "object") { + WRAPPED_ENTRY = wrapExportedHandler(middleware_insertion_facade_default); +} else if (typeof middleware_insertion_facade_default === "function") { + WRAPPED_ENTRY = wrapWorkerEntrypoint(middleware_insertion_facade_default); +} +var middleware_loader_entry_default = WRAPPED_ENTRY; +export { + __INTERNAL_WRANGLER_MIDDLEWARE__, + middleware_loader_entry_default as default +}; +//# sourceMappingURL=ProxyServerWorker.js.map diff --git a/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js.map b/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js.map new file mode 100644 index 0000000..8b29a49 --- /dev/null +++ b/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["../../../node_modules/wrangler/wrangler-dist/ProxyServerWorker.js", "../../../node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts", "../bundle-lfsPwi/middleware-insertion-facade.js", "../../../node_modules/wrangler/templates/middleware/common.ts", "../bundle-lfsPwi/middleware-loader.entry.ts"], + "sourceRoot": "/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/dev-ePVlVV", + "sourcesContent": ["// ../../node_modules/.pnpm/capnweb@0.5.0/node_modules/capnweb/dist/index-workers.js\nimport * as cfw from \"cloudflare:workers\";\nvar WORKERS_MODULE_SYMBOL = /* @__PURE__ */ Symbol(\"workers-module\");\nglobalThis[WORKERS_MODULE_SYMBOL] = cfw;\nif (!Symbol.dispose) {\n Symbol.dispose = /* @__PURE__ */ Symbol.for(\"dispose\");\n}\nif (!Symbol.asyncDispose) {\n Symbol.asyncDispose = /* @__PURE__ */ Symbol.for(\"asyncDispose\");\n}\nif (!Promise.withResolvers) {\n Promise.withResolvers = function() {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n };\n}\nvar workersModule = globalThis[WORKERS_MODULE_SYMBOL];\nvar RpcTarget = workersModule ? workersModule.RpcTarget : class {\n};\nvar AsyncFunction = (async function() {\n}).constructor;\nfunction typeForRpc(value) {\n switch (typeof value) {\n case \"boolean\":\n case \"number\":\n case \"string\":\n return \"primitive\";\n case \"undefined\":\n return \"undefined\";\n case \"object\":\n case \"function\":\n break;\n case \"bigint\":\n return \"bigint\";\n default:\n return \"unsupported\";\n }\n if (value === null) {\n return \"primitive\";\n }\n let prototype = Object.getPrototypeOf(value);\n switch (prototype) {\n case Object.prototype:\n return \"object\";\n case Function.prototype:\n case AsyncFunction.prototype:\n return \"function\";\n case Array.prototype:\n return \"array\";\n case Date.prototype:\n return \"date\";\n case Uint8Array.prototype:\n return \"bytes\";\n case WritableStream.prototype:\n return \"writable\";\n case ReadableStream.prototype:\n return \"readable\";\n case Headers.prototype:\n return \"headers\";\n case Request.prototype:\n return \"request\";\n case Response.prototype:\n return \"response\";\n // TODO: All other structured clone types.\n case RpcStub.prototype:\n return \"stub\";\n case RpcPromise.prototype:\n return \"rpc-promise\";\n // TODO: Promise or thenable\n default:\n if (workersModule) {\n if (prototype == workersModule.RpcStub.prototype || value instanceof workersModule.ServiceStub) {\n return \"rpc-target\";\n } else if (prototype == workersModule.RpcPromise.prototype || prototype == workersModule.RpcProperty.prototype) {\n return \"rpc-thenable\";\n }\n }\n if (value instanceof RpcTarget) {\n return \"rpc-target\";\n }\n if (value instanceof Error) {\n return \"error\";\n }\n return \"unsupported\";\n }\n}\nfunction mapNotLoaded() {\n throw new Error(\"RPC map() implementation was not loaded.\");\n}\nvar mapImpl = { applyMap: mapNotLoaded, sendMap: mapNotLoaded };\nfunction streamNotLoaded() {\n throw new Error(\"Stream implementation was not loaded.\");\n}\nvar streamImpl = {\n createWritableStreamHook: streamNotLoaded,\n createWritableStreamFromHook: streamNotLoaded,\n createReadableStreamHook: streamNotLoaded\n};\nvar StubHook = class {\n // Like call(), but designed for streaming calls (e.g. WritableStream writes). Returns:\n // - promise: A Promise for the completion of the call.\n // - size: If the call was remote, the byte size of the serialized message. For local calls,\n // undefined is returned, indicating the caller should await the promise to serialize writes\n // (no overlapping).\n stream(path, args) {\n let hook = this.call(path, args);\n let pulled = hook.pull();\n let promise;\n if (pulled instanceof Promise) {\n promise = pulled.then((p) => {\n p.dispose();\n });\n } else {\n pulled.dispose();\n promise = Promise.resolve();\n }\n return { promise };\n }\n};\nvar ErrorStubHook = class extends StubHook {\n constructor(error) {\n super();\n this.error = error;\n }\n call(path, args) {\n return this;\n }\n map(path, captures, instructions) {\n return this;\n }\n get(path) {\n return this;\n }\n dup() {\n return this;\n }\n pull() {\n return Promise.reject(this.error);\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n }\n onBroken(callback) {\n try {\n callback(this.error);\n } catch (err) {\n Promise.resolve(err);\n }\n }\n};\nvar DISPOSED_HOOK = new ErrorStubHook(\n new Error(\"Attempted to use RPC stub after it has been disposed.\")\n);\nvar doCall = (hook, path, params) => {\n return hook.call(path, params);\n};\nfunction withCallInterceptor(interceptor, callback) {\n let oldValue = doCall;\n doCall = interceptor;\n try {\n return callback();\n } finally {\n doCall = oldValue;\n }\n}\nvar RAW_STUB = /* @__PURE__ */ Symbol(\"realStub\");\nvar PROXY_HANDLERS = {\n apply(target, thisArg, argumentsList) {\n let stub = target.raw;\n return new RpcPromise(doCall(\n stub.hook,\n stub.pathIfPromise || [],\n RpcPayload.fromAppParams(argumentsList)\n ), []);\n },\n get(target, prop, receiver) {\n let stub = target.raw;\n if (prop === RAW_STUB) {\n return stub;\n } else if (prop in RpcPromise.prototype) {\n return stub[prop];\n } else if (typeof prop === \"string\") {\n return new RpcPromise(\n stub.hook,\n stub.pathIfPromise ? [...stub.pathIfPromise, prop] : [prop]\n );\n } else if (prop === Symbol.dispose && (!stub.pathIfPromise || stub.pathIfPromise.length == 0)) {\n return () => {\n stub.hook.dispose();\n stub.hook = DISPOSED_HOOK;\n };\n } else {\n return void 0;\n }\n },\n has(target, prop) {\n let stub = target.raw;\n if (prop === RAW_STUB) {\n return true;\n } else if (prop in RpcPromise.prototype) {\n return prop in stub;\n } else if (typeof prop === \"string\") {\n return true;\n } else if (prop === Symbol.dispose && (!stub.pathIfPromise || stub.pathIfPromise.length == 0)) {\n return true;\n } else {\n return false;\n }\n },\n construct(target, args) {\n throw new Error(\"An RPC stub cannot be used as a constructor.\");\n },\n defineProperty(target, property, attributes) {\n throw new Error(\"Can't define properties on RPC stubs.\");\n },\n deleteProperty(target, p) {\n throw new Error(\"Can't delete properties on RPC stubs.\");\n },\n getOwnPropertyDescriptor(target, p) {\n return void 0;\n },\n getPrototypeOf(target) {\n return Object.getPrototypeOf(target.raw);\n },\n isExtensible(target) {\n return false;\n },\n ownKeys(target) {\n return [];\n },\n preventExtensions(target) {\n return true;\n },\n set(target, p, newValue, receiver) {\n throw new Error(\"Can't assign properties on RPC stubs.\");\n },\n setPrototypeOf(target, v) {\n throw new Error(\"Can't override prototype of RPC stubs.\");\n }\n};\nvar RpcStub = class _RpcStub extends RpcTarget {\n // Although `hook` and `path` are declared `public` here, they are effectively hidden by the\n // proxy.\n constructor(hook, pathIfPromise) {\n super();\n if (!(hook instanceof StubHook)) {\n let value = hook;\n if (value instanceof RpcTarget || value instanceof Function) {\n hook = TargetStubHook.create(value, void 0);\n } else {\n hook = new PayloadStubHook(RpcPayload.fromAppReturn(value));\n }\n if (pathIfPromise) {\n throw new TypeError(\"RpcStub constructor expected one argument, received two.\");\n }\n }\n this.hook = hook;\n this.pathIfPromise = pathIfPromise;\n let func = () => {\n };\n func.raw = this;\n return new Proxy(func, PROXY_HANDLERS);\n }\n hook;\n pathIfPromise;\n dup() {\n let target = this[RAW_STUB];\n if (target.pathIfPromise) {\n return new _RpcStub(target.hook.get(target.pathIfPromise));\n } else {\n return new _RpcStub(target.hook.dup());\n }\n }\n onRpcBroken(callback) {\n this[RAW_STUB].hook.onBroken(callback);\n }\n map(func) {\n let { hook, pathIfPromise } = this[RAW_STUB];\n return mapImpl.sendMap(hook, pathIfPromise || [], func);\n }\n toString() {\n return \"[object RpcStub]\";\n }\n};\nvar RpcPromise = class extends RpcStub {\n // TODO: Support passing target value or promise to constructor.\n constructor(hook, pathIfPromise) {\n super(hook, pathIfPromise);\n }\n then(onfulfilled, onrejected) {\n return pullPromise(this).then(...arguments);\n }\n catch(onrejected) {\n return pullPromise(this).catch(...arguments);\n }\n finally(onfinally) {\n return pullPromise(this).finally(...arguments);\n }\n toString() {\n return \"[object RpcPromise]\";\n }\n};\nfunction unwrapStubTakingOwnership(stub) {\n let { hook, pathIfPromise } = stub[RAW_STUB];\n if (pathIfPromise && pathIfPromise.length > 0) {\n return hook.get(pathIfPromise);\n } else {\n return hook;\n }\n}\nfunction unwrapStubAndDup(stub) {\n let { hook, pathIfPromise } = stub[RAW_STUB];\n if (pathIfPromise) {\n return hook.get(pathIfPromise);\n } else {\n return hook.dup();\n }\n}\nfunction unwrapStubNoProperties(stub) {\n let { hook, pathIfPromise } = stub[RAW_STUB];\n if (pathIfPromise && pathIfPromise.length > 0) {\n return void 0;\n }\n return hook;\n}\nfunction unwrapStubOrParent(stub) {\n return stub[RAW_STUB].hook;\n}\nfunction unwrapStubAndPath(stub) {\n return stub[RAW_STUB];\n}\nasync function pullPromise(promise) {\n let { hook, pathIfPromise } = promise[RAW_STUB];\n if (pathIfPromise.length > 0) {\n hook = hook.get(pathIfPromise);\n }\n let payload = await hook.pull();\n return payload.deliverResolve();\n}\nvar RpcPayload = class _RpcPayload {\n // Private constructor; use factory functions above to construct.\n constructor(value, source, hooks, promises) {\n this.value = value;\n this.source = source;\n this.hooks = hooks;\n this.promises = promises;\n }\n // Create a payload from a value passed as params to an RPC from the app.\n //\n // The payload does NOT take ownership of any stubs in `value`, and but promises not to modify\n // `value`. If the payload is delivered locally, `value` will be deep-copied first, so as not\n // to have the sender and recipient end up sharing the same mutable object. `value` will not be\n // touched again after the call returns synchronously (returns a promise) -- by that point,\n // the value has either been copied or serialized to the wire.\n static fromAppParams(value) {\n return new _RpcPayload(value, \"params\");\n }\n // Create a payload from a value return from an RPC implementation by the app.\n //\n // Unlike fromAppParams(), in this case the payload takes ownership of all stubs in `value`, and\n // may hold onto `value` for an arbitrarily long time (e.g. to serve pipelined requests). It\n // will still avoid modifying `value` and will make a deep copy if it is delivered locally.\n static fromAppReturn(value) {\n return new _RpcPayload(value, \"return\");\n }\n // Combine an array of payloads into a single payload whose value is an array. Ownership of all\n // stubs is transferred from the inputs to the outputs, hence if the output is disposed, the\n // inputs should not be. (In case of exception, nothing is disposed, though.)\n static fromArray(array) {\n let hooks = [];\n let promises = [];\n let resultArray = [];\n for (let payload of array) {\n payload.ensureDeepCopied();\n for (let hook of payload.hooks) {\n hooks.push(hook);\n }\n for (let promise of payload.promises) {\n if (promise.parent === payload) {\n promise = {\n parent: resultArray,\n property: resultArray.length,\n promise: promise.promise\n };\n }\n promises.push(promise);\n }\n resultArray.push(payload.value);\n }\n return new _RpcPayload(resultArray, \"owned\", hooks, promises);\n }\n // Create a payload from a value parsed off the wire using Evaluator.evaluate().\n //\n // A payload is constructed with a null value and the given hooks and promises arrays. The value\n // is expected to be filled in by the evaluator, and the hooks and promises arrays are expected\n // to be extended with stubs found during parsing. (This weird usage model is necessary so that\n // if the root value turns out to be a promise, its `parent` in `promises` can be the payload\n // object itself.)\n //\n // When done, the payload takes ownership of the final value and all the stubs within. It may\n // modify the value in preparation for delivery, and may deliver the value directly to the app\n // without copying.\n static forEvaluate(hooks, promises) {\n return new _RpcPayload(null, \"owned\", hooks, promises);\n }\n // Deep-copy the given value, including dup()ing all stubs.\n //\n // If `value` is a function, it should be bound to `oldParent` as its `this`.\n //\n // If deep-copying from a branch of some other RpcPayload, it must be provided, to make sure\n // RpcTargets found within don't get duplicate stubs.\n static deepCopyFrom(value, oldParent, owner) {\n let result = new _RpcPayload(null, \"owned\", [], []);\n result.value = result.deepCopy(\n value,\n oldParent,\n \"value\",\n result,\n /*dupStubs=*/\n true,\n owner\n );\n return result;\n }\n // For `source === \"return\"` payloads only, this tracks any StubHooks created around RpcTargets\n // or WritableStreams found in the payload at the time that it is serialized (or deep-copied) for\n // return, so that we can make sure they are not disposed before the pipeline ends.\n //\n // This is initialized on first use.\n rpcTargets;\n // Get the StubHook representing the given RpcTarget found inside this payload.\n getHookForRpcTarget(target, parent, dupStubs = true) {\n if (this.source === \"params\") {\n if (dupStubs) {\n let dupable = target;\n if (typeof dupable.dup === \"function\") {\n target = dupable.dup();\n }\n }\n return TargetStubHook.create(target, parent);\n } else if (this.source === \"return\") {\n let hook = this.rpcTargets?.get(target);\n if (hook) {\n if (dupStubs) {\n return hook.dup();\n } else {\n this.rpcTargets?.delete(target);\n return hook;\n }\n } else {\n hook = TargetStubHook.create(target, parent);\n if (dupStubs) {\n if (!this.rpcTargets) {\n this.rpcTargets = /* @__PURE__ */ new Map();\n }\n this.rpcTargets.set(target, hook);\n return hook.dup();\n } else {\n return hook;\n }\n }\n } else {\n throw new Error(\"owned payload shouldn't contain raw RpcTargets\");\n }\n }\n // Get the StubHook representing the given WritableStream found inside this payload.\n getHookForWritableStream(stream, parent, dupStubs = true) {\n if (this.source === \"params\") {\n return streamImpl.createWritableStreamHook(stream);\n } else if (this.source === \"return\") {\n let hook = this.rpcTargets?.get(stream);\n if (hook) {\n if (dupStubs) {\n return hook.dup();\n } else {\n this.rpcTargets?.delete(stream);\n return hook;\n }\n } else {\n hook = streamImpl.createWritableStreamHook(stream);\n if (dupStubs) {\n if (!this.rpcTargets) {\n this.rpcTargets = /* @__PURE__ */ new Map();\n }\n this.rpcTargets.set(stream, hook);\n return hook.dup();\n } else {\n return hook;\n }\n }\n } else {\n throw new Error(\"owned payload shouldn't contain raw WritableStreams\");\n }\n }\n // Get the StubHook representing the given ReadableStream found inside this payload.\n getHookForReadableStream(stream, parent, dupStubs = true) {\n if (this.source === \"params\") {\n return streamImpl.createReadableStreamHook(stream);\n } else if (this.source === \"return\") {\n let hook = this.rpcTargets?.get(stream);\n if (hook) {\n if (dupStubs) {\n return hook.dup();\n } else {\n this.rpcTargets?.delete(stream);\n return hook;\n }\n } else {\n hook = streamImpl.createReadableStreamHook(stream);\n if (dupStubs) {\n if (!this.rpcTargets) {\n this.rpcTargets = /* @__PURE__ */ new Map();\n }\n this.rpcTargets.set(stream, hook);\n return hook.dup();\n } else {\n return hook;\n }\n }\n } else {\n throw new Error(\"owned payload shouldn't contain raw ReadableStreams\");\n }\n }\n deepCopy(value, oldParent, property, parent, dupStubs, owner) {\n let kind = typeForRpc(value);\n switch (kind) {\n case \"unsupported\":\n return value;\n case \"primitive\":\n case \"bigint\":\n case \"date\":\n case \"bytes\":\n case \"error\":\n case \"undefined\":\n return value;\n case \"array\": {\n let array = value;\n let len = array.length;\n let result = new Array(len);\n for (let i = 0; i < len; i++) {\n result[i] = this.deepCopy(array[i], array, i, result, dupStubs, owner);\n }\n return result;\n }\n case \"object\": {\n let result = {};\n let object = value;\n for (let i in object) {\n result[i] = this.deepCopy(object[i], object, i, result, dupStubs, owner);\n }\n return result;\n }\n case \"stub\":\n case \"rpc-promise\": {\n let stub = value;\n let hook;\n if (dupStubs) {\n hook = unwrapStubAndDup(stub);\n } else {\n hook = unwrapStubTakingOwnership(stub);\n }\n if (stub instanceof RpcPromise) {\n let promise = new RpcPromise(hook, []);\n this.promises.push({ parent, property, promise });\n return promise;\n } else {\n this.hooks.push(hook);\n return new RpcStub(hook);\n }\n }\n case \"function\":\n case \"rpc-target\": {\n let target = value;\n let hook;\n if (owner) {\n hook = owner.getHookForRpcTarget(target, oldParent, dupStubs);\n } else {\n hook = TargetStubHook.create(target, oldParent);\n }\n this.hooks.push(hook);\n return new RpcStub(hook);\n }\n case \"rpc-thenable\": {\n let target = value;\n let promise;\n if (owner) {\n promise = new RpcPromise(owner.getHookForRpcTarget(target, oldParent, dupStubs), []);\n } else {\n promise = new RpcPromise(TargetStubHook.create(target, oldParent), []);\n }\n this.promises.push({ parent, property, promise });\n return promise;\n }\n case \"writable\": {\n let stream = value;\n let hook;\n if (owner) {\n hook = owner.getHookForWritableStream(stream, oldParent, dupStubs);\n } else {\n hook = streamImpl.createWritableStreamHook(stream);\n }\n this.hooks.push(hook);\n return stream;\n }\n case \"readable\": {\n let stream = value;\n let hook;\n if (owner) {\n hook = owner.getHookForReadableStream(stream, oldParent, dupStubs);\n } else {\n hook = streamImpl.createReadableStreamHook(stream);\n }\n this.hooks.push(hook);\n return stream;\n }\n case \"headers\":\n return new Headers(value);\n case \"request\": {\n let req = value;\n if (req.body) {\n this.deepCopy(req.body, req, \"body\", req, dupStubs, owner);\n }\n return new Request(req);\n }\n case \"response\": {\n let resp = value;\n if (resp.body) {\n this.deepCopy(resp.body, resp, \"body\", resp, dupStubs, owner);\n }\n return new Response(resp.body, resp);\n }\n default:\n throw new Error(\"unreachable\");\n }\n }\n // Ensures that if the value originally came from an unowned source, we have replaced it with a\n // deep copy.\n ensureDeepCopied() {\n if (this.source !== \"owned\") {\n let dupStubs = this.source === \"params\";\n this.hooks = [];\n this.promises = [];\n try {\n this.value = this.deepCopy(this.value, void 0, \"value\", this, dupStubs, this);\n } catch (err) {\n this.hooks = void 0;\n this.promises = void 0;\n throw err;\n }\n this.source = \"owned\";\n if (this.rpcTargets && this.rpcTargets.size > 0) {\n throw new Error(\"Not all rpcTargets were accounted for in deep-copy?\");\n }\n this.rpcTargets = void 0;\n }\n }\n // Resolve all promises in this payload and then assign the final value into `parent[property]`.\n deliverTo(parent, property, promises) {\n this.ensureDeepCopied();\n if (this.value instanceof RpcPromise) {\n _RpcPayload.deliverRpcPromiseTo(this.value, parent, property, promises);\n } else {\n parent[property] = this.value;\n for (let record of this.promises) {\n _RpcPayload.deliverRpcPromiseTo(record.promise, record.parent, record.property, promises);\n }\n }\n }\n static deliverRpcPromiseTo(promise, parent, property, promises) {\n let hook = unwrapStubNoProperties(promise);\n if (!hook) {\n throw new Error(\"property promises should have been resolved earlier\");\n }\n let inner = hook.pull();\n if (inner instanceof _RpcPayload) {\n inner.deliverTo(parent, property, promises);\n } else {\n promises.push(inner.then((payload) => {\n let subPromises = [];\n payload.deliverTo(parent, property, subPromises);\n if (subPromises.length > 0) {\n return Promise.all(subPromises);\n }\n }));\n }\n }\n // Call the given function with the payload as an argument. The call is made synchronously if\n // possible, in order to maintain e-order. However, if any RpcPromises exist in the payload,\n // they are awaited and substituted before calling the function. The result of the call is\n // wrapped into another payload.\n //\n // The payload is automatically disposed after the call completes. The caller should not call\n // dispose().\n async deliverCall(func, thisArg) {\n try {\n let promises = [];\n this.deliverTo(this, \"value\", promises);\n if (promises.length > 0) {\n await Promise.all(promises);\n }\n let result = Function.prototype.apply.call(func, thisArg, this.value);\n if (result instanceof RpcPromise) {\n return _RpcPayload.fromAppReturn(result);\n } else {\n return _RpcPayload.fromAppReturn(await result);\n }\n } finally {\n this.dispose();\n }\n }\n // Produce a promise for this payload for return to the application. Any RpcPromises in the\n // payload are awaited and substituted with their results first.\n //\n // The returned object will have a disposer which disposes the payload. The caller should not\n // separately dispose it.\n async deliverResolve() {\n try {\n let promises = [];\n this.deliverTo(this, \"value\", promises);\n if (promises.length > 0) {\n await Promise.all(promises);\n }\n let result = this.value;\n if (result instanceof Object) {\n if (!(Symbol.dispose in result)) {\n Object.defineProperty(result, Symbol.dispose, {\n // NOTE: Using `this.dispose.bind(this)` here causes Playwright's build of\n // Chromium 140.0.7339.16 to fail when the object is assigned to a `using` variable,\n // with the error:\n // TypeError: Symbol(Symbol.dispose) is not a function\n // I cannot reproduce this problem in Chrome 140.0.7339.127 nor in Node or workerd,\n // so maybe it was a short-lived V8 bug or something. To be safe, though, we use\n // `() => this.dispose()`, which seems to always work.\n value: () => this.dispose(),\n writable: true,\n enumerable: false,\n configurable: true\n });\n }\n }\n return result;\n } catch (err) {\n this.dispose();\n throw err;\n }\n }\n dispose() {\n if (this.source === \"owned\") {\n this.hooks.forEach((hook) => hook.dispose());\n this.promises.forEach((promise) => promise.promise[Symbol.dispose]());\n } else if (this.source === \"return\") {\n this.disposeImpl(this.value, void 0);\n if (this.rpcTargets && this.rpcTargets.size > 0) {\n throw new Error(\"Not all rpcTargets were accounted for in disposeImpl()?\");\n }\n } else ;\n this.source = \"owned\";\n this.hooks = [];\n this.promises = [];\n }\n // Recursive dispose, called only when `source` is \"return\".\n disposeImpl(value, parent) {\n let kind = typeForRpc(value);\n switch (kind) {\n case \"unsupported\":\n case \"primitive\":\n case \"bigint\":\n case \"bytes\":\n case \"date\":\n case \"error\":\n case \"undefined\":\n return;\n case \"array\": {\n let array = value;\n let len = array.length;\n for (let i = 0; i < len; i++) {\n this.disposeImpl(array[i], array);\n }\n return;\n }\n case \"object\": {\n let object = value;\n for (let i in object) {\n this.disposeImpl(object[i], object);\n }\n return;\n }\n case \"stub\":\n case \"rpc-promise\": {\n let stub = value;\n let hook = unwrapStubNoProperties(stub);\n if (hook) {\n hook.dispose();\n }\n return;\n }\n case \"function\":\n case \"rpc-target\": {\n let target = value;\n let hook = this.rpcTargets?.get(target);\n if (hook) {\n hook.dispose();\n this.rpcTargets.delete(target);\n } else {\n disposeRpcTarget(target);\n }\n return;\n }\n case \"rpc-thenable\":\n return;\n case \"headers\":\n return;\n case \"request\": {\n let req = value;\n if (req.body) this.disposeImpl(req.body, req);\n return;\n }\n case \"response\": {\n let resp = value;\n if (resp.body) this.disposeImpl(resp.body, resp);\n return;\n }\n case \"writable\": {\n let stream = value;\n let hook = this.rpcTargets?.get(stream);\n if (hook) {\n this.rpcTargets.delete(stream);\n } else {\n hook = streamImpl.createWritableStreamHook(stream);\n }\n hook.dispose();\n return;\n }\n case \"readable\": {\n let stream = value;\n let hook = this.rpcTargets?.get(stream);\n if (hook) {\n this.rpcTargets.delete(stream);\n } else {\n hook = streamImpl.createReadableStreamHook(stream);\n }\n hook.dispose();\n return;\n }\n default:\n return;\n }\n }\n // Ignore unhandled rejections in all promises in this payload -- that is, all promises that\n // *would* be awaited if this payload were to be delivered. See the similarly-named method of\n // StubHook for explanation.\n ignoreUnhandledRejections() {\n if (this.hooks) {\n this.hooks.forEach((hook) => {\n hook.ignoreUnhandledRejections();\n });\n this.promises.forEach(\n (promise) => unwrapStubOrParent(promise.promise).ignoreUnhandledRejections()\n );\n } else {\n this.ignoreUnhandledRejectionsImpl(this.value);\n }\n }\n ignoreUnhandledRejectionsImpl(value) {\n let kind = typeForRpc(value);\n switch (kind) {\n case \"unsupported\":\n case \"primitive\":\n case \"bigint\":\n case \"bytes\":\n case \"date\":\n case \"error\":\n case \"undefined\":\n case \"function\":\n case \"rpc-target\":\n case \"writable\":\n case \"readable\":\n case \"headers\":\n case \"request\":\n case \"response\":\n return;\n case \"array\": {\n let array = value;\n let len = array.length;\n for (let i = 0; i < len; i++) {\n this.ignoreUnhandledRejectionsImpl(array[i]);\n }\n return;\n }\n case \"object\": {\n let object = value;\n for (let i in object) {\n this.ignoreUnhandledRejectionsImpl(object[i]);\n }\n return;\n }\n case \"stub\":\n case \"rpc-promise\":\n unwrapStubOrParent(value).ignoreUnhandledRejections();\n return;\n case \"rpc-thenable\":\n value.then((_) => {\n }, (_) => {\n });\n return;\n default:\n return;\n }\n }\n};\nfunction followPath(value, parent, path, owner) {\n for (let i = 0; i < path.length; i++) {\n parent = value;\n let part = path[i];\n if (part in Object.prototype) {\n value = void 0;\n continue;\n }\n let kind = typeForRpc(value);\n switch (kind) {\n case \"object\":\n case \"function\":\n if (Object.hasOwn(value, part)) {\n value = value[part];\n } else {\n value = void 0;\n }\n break;\n case \"array\":\n if (Number.isInteger(part) && part >= 0) {\n value = value[part];\n } else {\n value = void 0;\n }\n break;\n case \"rpc-target\":\n case \"rpc-thenable\": {\n if (Object.hasOwn(value, part)) {\n throw new TypeError(\n `Attempted to access property '${part}', which is an instance property of the RpcTarget. To avoid leaking private internals, instance properties cannot be accessed over RPC. If you want to make this property available over RPC, define it as a method or getter on the class, instead of an instance property.`\n );\n } else {\n value = value[part];\n }\n owner = null;\n break;\n }\n case \"stub\":\n case \"rpc-promise\": {\n let { hook, pathIfPromise } = unwrapStubAndPath(value);\n return { hook, remainingPath: pathIfPromise ? pathIfPromise.concat(path.slice(i)) : path.slice(i) };\n }\n case \"writable\":\n value = void 0;\n break;\n case \"readable\":\n value = void 0;\n break;\n case \"primitive\":\n case \"bigint\":\n case \"bytes\":\n case \"date\":\n case \"error\":\n case \"headers\":\n case \"request\":\n case \"response\":\n value = void 0;\n break;\n case \"undefined\":\n value = value[part];\n break;\n case \"unsupported\": {\n if (i === 0) {\n throw new TypeError(`RPC stub points at a non-serializable type.`);\n } else {\n let prefix = path.slice(0, i).join(\".\");\n let remainder = path.slice(0, i).join(\".\");\n throw new TypeError(\n `'${prefix}' is not a serializable type, so property ${remainder} cannot be accessed.`\n );\n }\n }\n default:\n throw new TypeError(\"unreachable\");\n }\n }\n if (value instanceof RpcPromise) {\n let { hook, pathIfPromise } = unwrapStubAndPath(value);\n return { hook, remainingPath: pathIfPromise || [] };\n }\n return {\n value,\n parent,\n owner\n };\n}\nvar ValueStubHook = class extends StubHook {\n call(path, args) {\n try {\n let { value, owner } = this.getValue();\n let followResult = followPath(value, void 0, path, owner);\n if (followResult.hook) {\n return followResult.hook.call(followResult.remainingPath, args);\n }\n if (typeof followResult.value != \"function\") {\n throw new TypeError(`'${path.join(\".\")}' is not a function.`);\n }\n let promise = args.deliverCall(followResult.value, followResult.parent);\n return new PromiseStubHook(promise.then((payload) => {\n return new PayloadStubHook(payload);\n }));\n } catch (err) {\n return new ErrorStubHook(err);\n }\n }\n map(path, captures, instructions) {\n try {\n let followResult;\n try {\n let { value, owner } = this.getValue();\n followResult = followPath(value, void 0, path, owner);\n ;\n } catch (err) {\n for (let cap of captures) {\n cap.dispose();\n }\n throw err;\n }\n if (followResult.hook) {\n return followResult.hook.map(followResult.remainingPath, captures, instructions);\n }\n return mapImpl.applyMap(\n followResult.value,\n followResult.parent,\n followResult.owner,\n captures,\n instructions\n );\n } catch (err) {\n return new ErrorStubHook(err);\n }\n }\n get(path) {\n try {\n let { value, owner } = this.getValue();\n if (path.length === 0 && owner === null) {\n throw new Error(\"Can't dup an RpcTarget stub as a promise.\");\n }\n let followResult = followPath(value, void 0, path, owner);\n if (followResult.hook) {\n return followResult.hook.get(followResult.remainingPath);\n }\n return new PayloadStubHook(RpcPayload.deepCopyFrom(\n followResult.value,\n followResult.parent,\n followResult.owner\n ));\n } catch (err) {\n return new ErrorStubHook(err);\n }\n }\n};\nvar PayloadStubHook = class _PayloadStubHook extends ValueStubHook {\n constructor(payload) {\n super();\n this.payload = payload;\n }\n payload;\n // cleared when disposed\n getPayload() {\n if (this.payload) {\n return this.payload;\n } else {\n throw new Error(\"Attempted to use an RPC StubHook after it was disposed.\");\n }\n }\n getValue() {\n let payload = this.getPayload();\n return { value: payload.value, owner: payload };\n }\n dup() {\n let thisPayload = this.getPayload();\n return new _PayloadStubHook(RpcPayload.deepCopyFrom(\n thisPayload.value,\n void 0,\n thisPayload\n ));\n }\n pull() {\n return this.getPayload();\n }\n ignoreUnhandledRejections() {\n if (this.payload) {\n this.payload.ignoreUnhandledRejections();\n }\n }\n dispose() {\n if (this.payload) {\n this.payload.dispose();\n this.payload = void 0;\n }\n }\n onBroken(callback) {\n if (this.payload) {\n if (this.payload.value instanceof RpcStub) {\n this.payload.value.onRpcBroken(callback);\n }\n }\n }\n};\nfunction disposeRpcTarget(target) {\n if (Symbol.dispose in target) {\n try {\n target[Symbol.dispose]();\n } catch (err) {\n Promise.reject(err);\n }\n }\n}\nvar TargetStubHook = class _TargetStubHook extends ValueStubHook {\n // Constructs a TargetStubHook that is not duplicated from an existing hook.\n //\n // If `value` is a function, `parent` is bound as its \"this\".\n static create(value, parent) {\n if (typeof value !== \"function\") {\n parent = void 0;\n }\n return new _TargetStubHook(value, parent);\n }\n constructor(target, parent, dupFrom) {\n super();\n this.target = target;\n this.parent = parent;\n if (dupFrom) {\n if (dupFrom.refcount) {\n this.refcount = dupFrom.refcount;\n ++this.refcount.count;\n }\n } else if (Symbol.dispose in target) {\n this.refcount = { count: 1 };\n }\n }\n target;\n // cleared when disposed\n parent;\n // `this` parameter when calling `target`\n refcount;\n // undefined if not needed (because target has no disposer)\n getTarget() {\n if (this.target) {\n return this.target;\n } else {\n throw new Error(\"Attempted to use an RPC StubHook after it was disposed.\");\n }\n }\n getValue() {\n return { value: this.getTarget(), owner: null };\n }\n dup() {\n return new _TargetStubHook(this.getTarget(), this.parent, this);\n }\n pull() {\n let target = this.getTarget();\n if (\"then\" in target) {\n return Promise.resolve(target).then((resolution) => {\n return RpcPayload.fromAppReturn(resolution);\n });\n } else {\n return Promise.reject(new Error(\"Tried to resolve a non-promise stub.\"));\n }\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n if (this.target) {\n if (this.refcount) {\n if (--this.refcount.count == 0) {\n disposeRpcTarget(this.target);\n }\n }\n this.target = void 0;\n }\n }\n onBroken(callback) {\n }\n};\nvar PromiseStubHook = class _PromiseStubHook extends StubHook {\n promise;\n resolution;\n constructor(promise) {\n super();\n this.promise = promise.then((res) => {\n this.resolution = res;\n return res;\n });\n }\n call(path, args) {\n args.ensureDeepCopied();\n return new _PromiseStubHook(this.promise.then((hook) => hook.call(path, args)));\n }\n stream(path, args) {\n args.ensureDeepCopied();\n let promise = this.promise.then((hook) => {\n let result = hook.stream(path, args);\n return result.promise;\n });\n return { promise };\n }\n map(path, captures, instructions) {\n return new _PromiseStubHook(this.promise.then(\n (hook) => hook.map(path, captures, instructions),\n (err) => {\n for (let cap of captures) {\n cap.dispose();\n }\n throw err;\n }\n ));\n }\n get(path) {\n return new _PromiseStubHook(this.promise.then((hook) => hook.get(path)));\n }\n dup() {\n if (this.resolution) {\n return this.resolution.dup();\n } else {\n return new _PromiseStubHook(this.promise.then((hook) => hook.dup()));\n }\n }\n pull() {\n if (this.resolution) {\n return this.resolution.pull();\n } else {\n return this.promise.then((hook) => hook.pull());\n }\n }\n ignoreUnhandledRejections() {\n if (this.resolution) {\n this.resolution.ignoreUnhandledRejections();\n } else {\n this.promise.then((res) => {\n res.ignoreUnhandledRejections();\n }, (err) => {\n });\n }\n }\n dispose() {\n if (this.resolution) {\n this.resolution.dispose();\n } else {\n this.promise.then((hook) => {\n hook.dispose();\n }, (err) => {\n });\n }\n }\n onBroken(callback) {\n if (this.resolution) {\n this.resolution.onBroken(callback);\n } else {\n this.promise.then((hook) => {\n hook.onBroken(callback);\n }, callback);\n }\n }\n};\nvar NullExporter = class {\n exportStub(stub) {\n throw new Error(\"Cannot serialize RPC stubs without an RPC session.\");\n }\n exportPromise(stub) {\n throw new Error(\"Cannot serialize RPC stubs without an RPC session.\");\n }\n getImport(hook) {\n return void 0;\n }\n unexport(ids) {\n }\n createPipe(readable) {\n throw new Error(\"Cannot create pipes without an RPC session.\");\n }\n onSendError(error) {\n }\n};\nvar NULL_EXPORTER = new NullExporter();\nvar ERROR_TYPES = {\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n AggregateError\n // TODO: DOMError? Others?\n};\nvar Devaluator = class _Devaluator {\n constructor(exporter, source) {\n this.exporter = exporter;\n this.source = source;\n }\n // Devaluate the given value.\n // * value: The value to devaluate.\n // * parent: The value's parent object, which would be used as `this` if the value were called\n // as a function.\n // * exporter: Callbacks to the RPC session for exporting capabilities found in this message.\n // * source: The RpcPayload which contains the value, and therefore owns stubs within.\n //\n // Returns: The devaluated value, ready to be JSON-serialized.\n static devaluate(value, parent, exporter = NULL_EXPORTER, source) {\n let devaluator = new _Devaluator(exporter, source);\n try {\n return devaluator.devaluateImpl(value, parent, 0);\n } catch (err) {\n if (devaluator.exports) {\n try {\n exporter.unexport(devaluator.exports);\n } catch (err2) {\n }\n }\n throw err;\n }\n }\n exports;\n devaluateImpl(value, parent, depth) {\n if (depth >= 64) {\n throw new Error(\n \"Serialization exceeded maximum allowed depth. (Does the message contain cycles?)\"\n );\n }\n let kind = typeForRpc(value);\n switch (kind) {\n case \"unsupported\": {\n let msg;\n try {\n msg = `Cannot serialize value: ${value}`;\n } catch (err) {\n msg = \"Cannot serialize value: (couldn't stringify value)\";\n }\n throw new TypeError(msg);\n }\n case \"primitive\":\n if (typeof value === \"number\" && !isFinite(value)) {\n if (value === Infinity) {\n return [\"inf\"];\n } else if (value === -Infinity) {\n return [\"-inf\"];\n } else {\n return [\"nan\"];\n }\n } else {\n return value;\n }\n case \"object\": {\n let object = value;\n let result = {};\n for (let key in object) {\n result[key] = this.devaluateImpl(object[key], object, depth + 1);\n }\n return result;\n }\n case \"array\": {\n let array = value;\n let len = array.length;\n let result = new Array(len);\n for (let i = 0; i < len; i++) {\n result[i] = this.devaluateImpl(array[i], array, depth + 1);\n }\n return [result];\n }\n case \"bigint\":\n return [\"bigint\", value.toString()];\n case \"date\":\n return [\"date\", value.getTime()];\n case \"bytes\": {\n let bytes = value;\n if (bytes.toBase64) {\n return [\"bytes\", bytes.toBase64({ omitPadding: true })];\n } else {\n return [\n \"bytes\",\n btoa(String.fromCharCode.apply(null, bytes).replace(/=*$/, \"\"))\n ];\n }\n }\n case \"headers\":\n return [\"headers\", [...value]];\n case \"request\": {\n let req = value;\n let init = {};\n if (req.method !== \"GET\") init.method = req.method;\n let headers = [...req.headers];\n if (headers.length > 0) {\n init.headers = headers;\n }\n if (req.body) {\n init.body = this.devaluateImpl(req.body, req, depth + 1);\n init.duplex = req.duplex || \"half\";\n } else if (req.body === void 0 && ![\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\", \"DELETE\"].includes(req.method)) {\n let bodyPromise = req.arrayBuffer();\n let readable = new ReadableStream({\n async start(controller) {\n try {\n controller.enqueue(new Uint8Array(await bodyPromise));\n controller.close();\n } catch (err) {\n controller.error(err);\n }\n }\n });\n let hook = streamImpl.createReadableStreamHook(readable);\n let importId = this.exporter.createPipe(readable, hook);\n init.body = [\"readable\", importId];\n init.duplex = req.duplex || \"half\";\n }\n if (req.cache && req.cache !== \"default\") init.cache = req.cache;\n if (req.redirect !== \"follow\") init.redirect = req.redirect;\n if (req.integrity) init.integrity = req.integrity;\n if (req.mode && req.mode !== \"cors\") init.mode = req.mode;\n if (req.credentials && req.credentials !== \"same-origin\") {\n init.credentials = req.credentials;\n }\n if (req.referrer && req.referrer !== \"about:client\") init.referrer = req.referrer;\n if (req.referrerPolicy) init.referrerPolicy = req.referrerPolicy;\n if (req.keepalive) init.keepalive = req.keepalive;\n let cfReq = req;\n if (cfReq.cf) init.cf = cfReq.cf;\n if (cfReq.encodeResponseBody && cfReq.encodeResponseBody !== \"automatic\") {\n init.encodeResponseBody = cfReq.encodeResponseBody;\n }\n return [\"request\", req.url, init];\n }\n case \"response\": {\n let resp = value;\n let body = this.devaluateImpl(resp.body, resp, depth + 1);\n let init = {};\n if (resp.status !== 200) init.status = resp.status;\n if (resp.statusText) init.statusText = resp.statusText;\n let headers = [...resp.headers];\n if (headers.length > 0) {\n init.headers = headers;\n }\n let cfResp = resp;\n if (cfResp.cf) init.cf = cfResp.cf;\n if (cfResp.encodeBody && cfResp.encodeBody !== \"automatic\") {\n init.encodeBody = cfResp.encodeBody;\n }\n if (cfResp.webSocket) {\n throw new TypeError(\"Can't serialize a Response containing a webSocket.\");\n }\n return [\"response\", body, init];\n }\n case \"error\": {\n let e = value;\n let rewritten = this.exporter.onSendError(e);\n if (rewritten) {\n e = rewritten;\n }\n let result = [\"error\", e.name, e.message];\n if (rewritten && rewritten.stack) {\n result.push(rewritten.stack);\n }\n return result;\n }\n case \"undefined\":\n return [\"undefined\"];\n case \"stub\":\n case \"rpc-promise\": {\n if (!this.source) {\n throw new Error(\"Can't serialize RPC stubs in this context.\");\n }\n let { hook, pathIfPromise } = unwrapStubAndPath(value);\n let importId = this.exporter.getImport(hook);\n if (importId !== void 0) {\n if (pathIfPromise) {\n if (pathIfPromise.length > 0) {\n return [\"pipeline\", importId, pathIfPromise];\n } else {\n return [\"pipeline\", importId];\n }\n } else {\n return [\"import\", importId];\n }\n }\n if (pathIfPromise) {\n hook = hook.get(pathIfPromise);\n } else {\n hook = hook.dup();\n }\n return this.devaluateHook(pathIfPromise ? \"promise\" : \"export\", hook);\n }\n case \"function\":\n case \"rpc-target\": {\n if (!this.source) {\n throw new Error(\"Can't serialize RPC stubs in this context.\");\n }\n let hook = this.source.getHookForRpcTarget(value, parent);\n return this.devaluateHook(\"export\", hook);\n }\n case \"rpc-thenable\": {\n if (!this.source) {\n throw new Error(\"Can't serialize RPC stubs in this context.\");\n }\n let hook = this.source.getHookForRpcTarget(value, parent);\n return this.devaluateHook(\"promise\", hook);\n }\n case \"writable\": {\n if (!this.source) {\n throw new Error(\"Can't serialize WritableStream in this context.\");\n }\n let hook = this.source.getHookForWritableStream(value, parent);\n return this.devaluateHook(\"writable\", hook);\n }\n case \"readable\": {\n if (!this.source) {\n throw new Error(\"Can't serialize ReadableStream in this context.\");\n }\n let ws = value;\n let hook = this.source.getHookForReadableStream(ws, parent);\n let importId = this.exporter.createPipe(ws, hook);\n return [\"readable\", importId];\n }\n default:\n throw new Error(\"unreachable\");\n }\n }\n devaluateHook(type, hook) {\n if (!this.exports) this.exports = [];\n let exportId = type === \"promise\" ? this.exporter.exportPromise(hook) : this.exporter.exportStub(hook);\n this.exports.push(exportId);\n return [type, exportId];\n }\n};\nvar NullImporter = class {\n importStub(idx) {\n throw new Error(\"Cannot deserialize RPC stubs without an RPC session.\");\n }\n importPromise(idx) {\n throw new Error(\"Cannot deserialize RPC stubs without an RPC session.\");\n }\n getExport(idx) {\n return void 0;\n }\n getPipeReadable(exportId) {\n throw new Error(\"Cannot retrieve pipe readable without an RPC session.\");\n }\n};\nvar NULL_IMPORTER = new NullImporter();\nfunction fixBrokenRequestBody(request, body) {\n let promise = new Response(body).arrayBuffer().then((arrayBuffer) => {\n let bytes = new Uint8Array(arrayBuffer);\n let result = new Request(request, { body: bytes });\n return new PayloadStubHook(RpcPayload.fromAppReturn(result));\n });\n return new RpcPromise(new PromiseStubHook(promise), []);\n}\nvar Evaluator = class _Evaluator {\n constructor(importer) {\n this.importer = importer;\n }\n hooks = [];\n promises = [];\n evaluate(value) {\n let payload = RpcPayload.forEvaluate(this.hooks, this.promises);\n try {\n payload.value = this.evaluateImpl(value, payload, \"value\");\n return payload;\n } catch (err) {\n payload.dispose();\n throw err;\n }\n }\n // Evaluate the value without destroying it.\n evaluateCopy(value) {\n return this.evaluate(structuredClone(value));\n }\n evaluateImpl(value, parent, property) {\n if (value instanceof Array) {\n if (value.length == 1 && value[0] instanceof Array) {\n let result = value[0];\n for (let i = 0; i < result.length; i++) {\n result[i] = this.evaluateImpl(result[i], result, i);\n }\n return result;\n } else switch (value[0]) {\n case \"bigint\":\n if (typeof value[1] == \"string\") {\n return BigInt(value[1]);\n }\n break;\n case \"date\":\n if (typeof value[1] == \"number\") {\n return new Date(value[1]);\n }\n break;\n case \"bytes\": {\n let b64 = Uint8Array;\n if (typeof value[1] == \"string\") {\n if (b64.fromBase64) {\n return b64.fromBase64(value[1]);\n } else {\n let bs = atob(value[1]);\n let len = bs.length;\n let bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = bs.charCodeAt(i);\n }\n return bytes;\n }\n }\n break;\n }\n case \"error\":\n if (value.length >= 3 && typeof value[1] === \"string\" && typeof value[2] === \"string\") {\n let cls = ERROR_TYPES[value[1]] || Error;\n let result = new cls(value[2]);\n if (typeof value[3] === \"string\") {\n result.stack = value[3];\n }\n return result;\n }\n break;\n case \"undefined\":\n if (value.length === 1) {\n return void 0;\n }\n break;\n case \"inf\":\n return Infinity;\n case \"-inf\":\n return -Infinity;\n case \"nan\":\n return NaN;\n case \"headers\":\n if (value.length === 2 && value[1] instanceof Array) {\n return new Headers(value[1]);\n }\n break;\n case \"request\": {\n if (value.length !== 3 || typeof value[1] !== \"string\") break;\n let url = value[1];\n let init = value[2];\n if (typeof init !== \"object\" || init === null) break;\n if (init.body) {\n init.body = this.evaluateImpl(init.body, init, \"body\");\n if (init.body === null || typeof init.body === \"string\" || init.body instanceof Uint8Array || init.body instanceof ReadableStream) ;\n else {\n throw new TypeError(\"Request body must be of type ReadableStream.\");\n }\n }\n if (init.signal) {\n init.signal = this.evaluateImpl(init.signal, init, \"signal\");\n if (!(init.signal instanceof AbortSignal)) {\n throw new TypeError(\"Request siganl must be of type AbortSignal.\");\n }\n }\n if (init.headers && !(init.headers instanceof Array)) {\n throw new TypeError(\"Request headers must be serialized as an array of pairs.\");\n }\n let result = new Request(url, init);\n if (init.body instanceof ReadableStream && result.body === void 0) {\n let promise = fixBrokenRequestBody(result, init.body);\n this.promises.push({ promise, parent, property });\n return promise;\n } else {\n return result;\n }\n }\n case \"response\": {\n if (value.length !== 3) break;\n let body = this.evaluateImpl(value[1], parent, property);\n if (body === null || typeof body === \"string\" || body instanceof Uint8Array || body instanceof ReadableStream) ;\n else {\n throw new TypeError(\"Response body must be of type ReadableStream.\");\n }\n let init = value[2];\n if (typeof init !== \"object\" || init === null) break;\n if (init.webSocket) {\n throw new TypeError(\"Can't deserialize a Response containing a webSocket.\");\n }\n if (init.headers && !(init.headers instanceof Array)) {\n throw new TypeError(\"Request headers must be serialized as an array of pairs.\");\n }\n return new Response(body, init);\n }\n case \"import\":\n case \"pipeline\": {\n if (value.length < 2 || value.length > 4) {\n break;\n }\n if (typeof value[1] != \"number\") {\n break;\n }\n let hook = this.importer.getExport(value[1]);\n if (!hook) {\n throw new Error(`no such entry on exports table: ${value[1]}`);\n }\n let isPromise = value[0] == \"pipeline\";\n let addStub = (hook2) => {\n if (isPromise) {\n let promise = new RpcPromise(hook2, []);\n this.promises.push({ promise, parent, property });\n return promise;\n } else {\n this.hooks.push(hook2);\n return new RpcPromise(hook2, []);\n }\n };\n if (value.length == 2) {\n if (isPromise) {\n return addStub(hook.get([]));\n } else {\n return addStub(hook.dup());\n }\n }\n let path = value[2];\n if (!(path instanceof Array)) {\n break;\n }\n if (!path.every(\n (part) => {\n return typeof part == \"string\" || typeof part == \"number\";\n }\n )) {\n break;\n }\n if (value.length == 3) {\n return addStub(hook.get(path));\n }\n let args = value[3];\n if (!(args instanceof Array)) {\n break;\n }\n let subEval = new _Evaluator(this.importer);\n args = subEval.evaluate([args]);\n return addStub(hook.call(path, args));\n }\n case \"remap\": {\n if (value.length !== 5 || typeof value[1] !== \"number\" || !(value[2] instanceof Array) || !(value[3] instanceof Array) || !(value[4] instanceof Array)) {\n break;\n }\n let hook = this.importer.getExport(value[1]);\n if (!hook) {\n throw new Error(`no such entry on exports table: ${value[1]}`);\n }\n let path = value[2];\n if (!path.every(\n (part) => {\n return typeof part == \"string\" || typeof part == \"number\";\n }\n )) {\n break;\n }\n let captures = value[3].map((cap) => {\n if (!(cap instanceof Array) || cap.length !== 2 || cap[0] !== \"import\" && cap[0] !== \"export\" || typeof cap[1] !== \"number\") {\n throw new TypeError(`unknown map capture: ${JSON.stringify(cap)}`);\n }\n if (cap[0] === \"export\") {\n return this.importer.importStub(cap[1]);\n } else {\n let exp = this.importer.getExport(cap[1]);\n if (!exp) {\n throw new Error(`no such entry on exports table: ${cap[1]}`);\n }\n return exp.dup();\n }\n });\n let instructions = value[4];\n let resultHook = hook.map(path, captures, instructions);\n let promise = new RpcPromise(resultHook, []);\n this.promises.push({ promise, parent, property });\n return promise;\n }\n case \"export\":\n case \"promise\":\n if (typeof value[1] == \"number\") {\n if (value[0] == \"promise\") {\n let hook = this.importer.importPromise(value[1]);\n let promise = new RpcPromise(hook, []);\n this.promises.push({ parent, property, promise });\n return promise;\n } else {\n let hook = this.importer.importStub(value[1]);\n this.hooks.push(hook);\n return new RpcStub(hook);\n }\n }\n break;\n case \"writable\":\n if (typeof value[1] == \"number\") {\n let hook = this.importer.importStub(value[1]);\n let stream = streamImpl.createWritableStreamFromHook(hook);\n this.hooks.push(hook);\n return stream;\n }\n break;\n case \"readable\":\n if (typeof value[1] == \"number\") {\n let stream = this.importer.getPipeReadable(value[1]);\n let hook = streamImpl.createReadableStreamHook(stream);\n this.hooks.push(hook);\n return stream;\n }\n break;\n }\n throw new TypeError(`unknown special value: ${JSON.stringify(value)}`);\n } else if (value instanceof Object) {\n let result = value;\n for (let key in result) {\n if (key in Object.prototype || key === \"toJSON\") {\n this.evaluateImpl(result[key], result, key);\n delete result[key];\n } else {\n result[key] = this.evaluateImpl(result[key], result, key);\n }\n }\n return result;\n } else {\n return value;\n }\n }\n};\nvar ImportTableEntry = class {\n constructor(session, importId, pulling) {\n this.session = session;\n this.importId = importId;\n if (pulling) {\n this.activePull = Promise.withResolvers();\n }\n }\n localRefcount = 0;\n remoteRefcount = 1;\n activePull;\n resolution;\n // List of integer indexes into session.onBrokenCallbacks which are callbacks registered on\n // this import. Initialized on first use (so `undefined` is the same as an empty list).\n onBrokenRegistrations;\n resolve(resolution) {\n if (this.localRefcount == 0) {\n resolution.dispose();\n return;\n }\n this.resolution = resolution;\n this.sendRelease();\n if (this.onBrokenRegistrations) {\n for (let i of this.onBrokenRegistrations) {\n let callback = this.session.onBrokenCallbacks[i];\n let endIndex = this.session.onBrokenCallbacks.length;\n resolution.onBroken(callback);\n if (this.session.onBrokenCallbacks[endIndex] === callback) {\n delete this.session.onBrokenCallbacks[endIndex];\n } else {\n delete this.session.onBrokenCallbacks[i];\n }\n }\n this.onBrokenRegistrations = void 0;\n }\n if (this.activePull) {\n this.activePull.resolve();\n this.activePull = void 0;\n }\n }\n async awaitResolution() {\n if (!this.activePull) {\n this.session.sendPull(this.importId);\n this.activePull = Promise.withResolvers();\n }\n await this.activePull.promise;\n return this.resolution.pull();\n }\n dispose() {\n if (this.resolution) {\n this.resolution.dispose();\n } else {\n this.abort(new Error(\"RPC was canceled because the RpcPromise was disposed.\"));\n this.sendRelease();\n }\n }\n abort(error) {\n if (!this.resolution) {\n this.resolution = new ErrorStubHook(error);\n if (this.activePull) {\n this.activePull.reject(error);\n this.activePull = void 0;\n }\n this.onBrokenRegistrations = void 0;\n }\n }\n onBroken(callback) {\n if (this.resolution) {\n this.resolution.onBroken(callback);\n } else {\n let index = this.session.onBrokenCallbacks.length;\n this.session.onBrokenCallbacks.push(callback);\n if (!this.onBrokenRegistrations) this.onBrokenRegistrations = [];\n this.onBrokenRegistrations.push(index);\n }\n }\n sendRelease() {\n if (this.remoteRefcount > 0) {\n this.session.sendRelease(this.importId, this.remoteRefcount);\n this.remoteRefcount = 0;\n }\n }\n};\nvar RpcImportHook = class _RpcImportHook extends StubHook {\n // undefined when we're disposed\n // `pulling` is true if we already expect that this import is going to be resolved later, and\n // null if this import is not allowed to be pulled (i.e. it's a stub not a promise).\n constructor(isPromise, entry) {\n super();\n this.isPromise = isPromise;\n ++entry.localRefcount;\n this.entry = entry;\n }\n entry;\n collectPath(path) {\n return this;\n }\n getEntry() {\n if (this.entry) {\n return this.entry;\n } else {\n throw new Error(\"This RpcImportHook was already disposed.\");\n }\n }\n // -------------------------------------------------------------------------------------\n // implements StubHook\n call(path, args) {\n let entry = this.getEntry();\n if (entry.resolution) {\n return entry.resolution.call(path, args);\n } else {\n return entry.session.sendCall(entry.importId, path, args);\n }\n }\n stream(path, args) {\n let entry = this.getEntry();\n if (entry.resolution) {\n return entry.resolution.stream(path, args);\n } else {\n return entry.session.sendStream(entry.importId, path, args);\n }\n }\n map(path, captures, instructions) {\n let entry;\n try {\n entry = this.getEntry();\n } catch (err) {\n for (let cap of captures) {\n cap.dispose();\n }\n throw err;\n }\n if (entry.resolution) {\n return entry.resolution.map(path, captures, instructions);\n } else {\n return entry.session.sendMap(entry.importId, path, captures, instructions);\n }\n }\n get(path) {\n let entry = this.getEntry();\n if (entry.resolution) {\n return entry.resolution.get(path);\n } else {\n return entry.session.sendCall(entry.importId, path);\n }\n }\n dup() {\n return new _RpcImportHook(false, this.getEntry());\n }\n pull() {\n let entry = this.getEntry();\n if (!this.isPromise) {\n throw new Error(\"Can't pull this hook because it's not a promise hook.\");\n }\n if (entry.resolution) {\n return entry.resolution.pull();\n }\n return entry.awaitResolution();\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n let entry = this.entry;\n this.entry = void 0;\n if (entry) {\n if (--entry.localRefcount === 0) {\n entry.dispose();\n }\n }\n }\n onBroken(callback) {\n if (this.entry) {\n this.entry.onBroken(callback);\n }\n }\n};\nvar RpcMainHook = class extends RpcImportHook {\n session;\n constructor(entry) {\n super(false, entry);\n this.session = entry.session;\n }\n dispose() {\n if (this.session) {\n let session = this.session;\n this.session = void 0;\n session.shutdown();\n }\n }\n};\nvar RpcSessionImpl = class {\n constructor(transport, mainHook, options) {\n this.transport = transport;\n this.options = options;\n this.exports.push({ hook: mainHook, refcount: 1 });\n this.imports.push(new ImportTableEntry(this, 0, false));\n let rejectFunc;\n let abortPromise = new Promise((resolve, reject) => {\n rejectFunc = reject;\n });\n this.cancelReadLoop = rejectFunc;\n this.readLoop(abortPromise).catch((err) => this.abort(err));\n }\n exports = [];\n reverseExports = /* @__PURE__ */ new Map();\n imports = [];\n abortReason;\n cancelReadLoop;\n // We assign positive numbers to imports we initiate, and negative numbers to exports we\n // initiate. So the next import ID is just `imports.length`, but the next export ID needs\n // to be tracked explicitly.\n nextExportId = -1;\n // If set, call this when all incoming calls are complete.\n onBatchDone;\n // How many promises is our peer expecting us to resolve?\n pullCount = 0;\n // Sparse array of onBrokenCallback registrations. Items are strictly appended to the end but\n // may be deleted from the middle (hence leaving the array sparse).\n onBrokenCallbacks = [];\n // Should only be called once immediately after construction.\n getMainImport() {\n return new RpcMainHook(this.imports[0]);\n }\n shutdown() {\n this.abort(new Error(\"RPC session was shut down by disposing the main stub\"), false);\n }\n exportStub(hook) {\n if (this.abortReason) throw this.abortReason;\n let existingExportId = this.reverseExports.get(hook);\n if (existingExportId !== void 0) {\n ++this.exports[existingExportId].refcount;\n return existingExportId;\n } else {\n let exportId = this.nextExportId--;\n this.exports[exportId] = { hook, refcount: 1 };\n this.reverseExports.set(hook, exportId);\n return exportId;\n }\n }\n exportPromise(hook) {\n if (this.abortReason) throw this.abortReason;\n let exportId = this.nextExportId--;\n this.exports[exportId] = { hook, refcount: 1 };\n this.reverseExports.set(hook, exportId);\n this.ensureResolvingExport(exportId);\n return exportId;\n }\n unexport(ids) {\n for (let id of ids) {\n this.releaseExport(id, 1);\n }\n }\n releaseExport(exportId, refcount) {\n let entry = this.exports[exportId];\n if (!entry) {\n throw new Error(`no such export ID: ${exportId}`);\n }\n if (entry.refcount < refcount) {\n throw new Error(`refcount would go negative: ${entry.refcount} < ${refcount}`);\n }\n entry.refcount -= refcount;\n if (entry.refcount === 0) {\n delete this.exports[exportId];\n this.reverseExports.delete(entry.hook);\n entry.hook.dispose();\n }\n }\n onSendError(error) {\n if (this.options.onSendError) {\n return this.options.onSendError(error);\n }\n }\n ensureResolvingExport(exportId) {\n let exp = this.exports[exportId];\n if (!exp) {\n throw new Error(`no such export ID: ${exportId}`);\n }\n if (!exp.pull) {\n let resolve = async () => {\n let hook = exp.hook;\n for (; ; ) {\n let payload = await hook.pull();\n if (payload.value instanceof RpcStub) {\n let { hook: inner, pathIfPromise } = unwrapStubAndPath(payload.value);\n if (pathIfPromise && pathIfPromise.length == 0) {\n if (this.getImport(hook) === void 0) {\n hook = inner;\n continue;\n }\n }\n }\n return payload;\n }\n };\n let autoRelease = exp.autoRelease;\n ++this.pullCount;\n exp.pull = resolve().then(\n (payload) => {\n let value = Devaluator.devaluate(payload.value, void 0, this, payload);\n this.send([\"resolve\", exportId, value]);\n if (autoRelease) this.releaseExport(exportId, 1);\n },\n (error) => {\n this.send([\"reject\", exportId, Devaluator.devaluate(error, void 0, this)]);\n if (autoRelease) this.releaseExport(exportId, 1);\n }\n ).catch(\n (error) => {\n try {\n this.send([\"reject\", exportId, Devaluator.devaluate(error, void 0, this)]);\n if (autoRelease) this.releaseExport(exportId, 1);\n } catch (error2) {\n this.abort(error2);\n }\n }\n ).finally(() => {\n if (--this.pullCount === 0) {\n if (this.onBatchDone) {\n this.onBatchDone.resolve();\n }\n }\n });\n }\n }\n getImport(hook) {\n if (hook instanceof RpcImportHook && hook.entry && hook.entry.session === this) {\n return hook.entry.importId;\n } else {\n return void 0;\n }\n }\n importStub(idx) {\n if (this.abortReason) throw this.abortReason;\n let entry = this.imports[idx];\n if (!entry) {\n entry = new ImportTableEntry(this, idx, false);\n this.imports[idx] = entry;\n }\n return new RpcImportHook(\n /*isPromise=*/\n false,\n entry\n );\n }\n importPromise(idx) {\n if (this.abortReason) throw this.abortReason;\n if (this.imports[idx]) {\n return new ErrorStubHook(new Error(\n \"Bug in RPC system: The peer sent a promise reusing an existing export ID.\"\n ));\n }\n let entry = new ImportTableEntry(this, idx, true);\n this.imports[idx] = entry;\n return new RpcImportHook(\n /*isPromise=*/\n true,\n entry\n );\n }\n getExport(idx) {\n return this.exports[idx]?.hook;\n }\n getPipeReadable(exportId) {\n let entry = this.exports[exportId];\n if (!entry || !entry.pipeReadable) {\n throw new Error(`Export ${exportId} is not a pipe or its readable end was already consumed.`);\n }\n let readable = entry.pipeReadable;\n entry.pipeReadable = void 0;\n return readable;\n }\n createPipe(readable, readableHook) {\n if (this.abortReason) throw this.abortReason;\n this.send([\"pipe\"]);\n let importId = this.imports.length;\n let entry = new ImportTableEntry(this, importId, false);\n this.imports.push(entry);\n let hook = new RpcImportHook(\n /*isPromise=*/\n false,\n entry\n );\n let writable = streamImpl.createWritableStreamFromHook(hook);\n readable.pipeTo(writable).catch(() => {\n }).finally(() => readableHook.dispose());\n return importId;\n }\n // Serializes and sends a message. Returns the byte length of the serialized message.\n send(msg) {\n if (this.abortReason !== void 0) {\n return 0;\n }\n let msgText;\n try {\n msgText = JSON.stringify(msg);\n } catch (err) {\n try {\n this.abort(err);\n } catch (err2) {\n }\n throw err;\n }\n this.transport.send(msgText).catch((err) => this.abort(err, false));\n return msgText.length;\n }\n sendCall(id, path, args) {\n if (this.abortReason) throw this.abortReason;\n let value = [\"pipeline\", id, path];\n if (args) {\n let devalue = Devaluator.devaluate(args.value, void 0, this, args);\n value.push(devalue[0]);\n }\n this.send([\"push\", value]);\n let entry = new ImportTableEntry(this, this.imports.length, false);\n this.imports.push(entry);\n return new RpcImportHook(\n /*isPromise=*/\n true,\n entry\n );\n }\n sendStream(id, path, args) {\n if (this.abortReason) throw this.abortReason;\n let value = [\"pipeline\", id, path];\n let devalue = Devaluator.devaluate(args.value, void 0, this, args);\n value.push(devalue[0]);\n let size = this.send([\"stream\", value]);\n let importId = this.imports.length;\n let entry = new ImportTableEntry(\n this,\n importId,\n /*pulling=*/\n true\n );\n entry.remoteRefcount = 0;\n entry.localRefcount = 1;\n this.imports.push(entry);\n let promise = entry.awaitResolution().then(\n (p) => {\n p.dispose();\n delete this.imports[importId];\n },\n (err) => {\n delete this.imports[importId];\n throw err;\n }\n );\n return { promise, size };\n }\n sendMap(id, path, captures, instructions) {\n if (this.abortReason) {\n for (let cap of captures) {\n cap.dispose();\n }\n throw this.abortReason;\n }\n let devaluedCaptures = captures.map((hook) => {\n let importId = this.getImport(hook);\n if (importId !== void 0) {\n return [\"import\", importId];\n } else {\n return [\"export\", this.exportStub(hook)];\n }\n });\n let value = [\"remap\", id, path, devaluedCaptures, instructions];\n this.send([\"push\", value]);\n let entry = new ImportTableEntry(this, this.imports.length, false);\n this.imports.push(entry);\n return new RpcImportHook(\n /*isPromise=*/\n true,\n entry\n );\n }\n sendPull(id) {\n if (this.abortReason) throw this.abortReason;\n this.send([\"pull\", id]);\n }\n sendRelease(id, remoteRefcount) {\n if (this.abortReason) return;\n this.send([\"release\", id, remoteRefcount]);\n delete this.imports[id];\n }\n abort(error, trySendAbortMessage = true) {\n if (this.abortReason !== void 0) return;\n this.cancelReadLoop(error);\n if (trySendAbortMessage) {\n try {\n this.transport.send(JSON.stringify([\"abort\", Devaluator.devaluate(error, void 0, this)])).catch((err) => {\n });\n } catch (err) {\n }\n }\n if (error === void 0) {\n error = \"undefined\";\n }\n this.abortReason = error;\n if (this.onBatchDone) {\n this.onBatchDone.reject(error);\n }\n if (this.transport.abort) {\n try {\n this.transport.abort(error);\n } catch (err) {\n Promise.resolve(err);\n }\n }\n for (let i in this.onBrokenCallbacks) {\n try {\n this.onBrokenCallbacks[i](error);\n } catch (err) {\n Promise.resolve(err);\n }\n }\n for (let i in this.imports) {\n this.imports[i].abort(error);\n }\n for (let i in this.exports) {\n this.exports[i].hook.dispose();\n }\n }\n async readLoop(abortPromise) {\n while (!this.abortReason) {\n let msg = JSON.parse(await Promise.race([this.transport.receive(), abortPromise]));\n if (this.abortReason) break;\n if (msg instanceof Array) {\n switch (msg[0]) {\n case \"push\":\n if (msg.length > 1) {\n let payload = new Evaluator(this).evaluate(msg[1]);\n let hook = new PayloadStubHook(payload);\n hook.ignoreUnhandledRejections();\n this.exports.push({ hook, refcount: 1 });\n continue;\n }\n break;\n case \"stream\": {\n if (msg.length > 1) {\n let payload = new Evaluator(this).evaluate(msg[1]);\n let hook = new PayloadStubHook(payload);\n hook.ignoreUnhandledRejections();\n let exportId = this.exports.length;\n this.exports.push({ hook, refcount: 1, autoRelease: true });\n this.ensureResolvingExport(exportId);\n continue;\n }\n break;\n }\n case \"pipe\": {\n let { readable, writable } = new TransformStream();\n let hook = streamImpl.createWritableStreamHook(writable);\n this.exports.push({ hook, refcount: 1, pipeReadable: readable });\n continue;\n }\n case \"pull\": {\n let exportId = msg[1];\n if (typeof exportId == \"number\") {\n this.ensureResolvingExport(exportId);\n continue;\n }\n break;\n }\n case \"resolve\":\n // [\"resolve\", ExportId, Expression]\n case \"reject\": {\n let importId = msg[1];\n if (typeof importId == \"number\" && msg.length > 2) {\n let imp = this.imports[importId];\n if (imp) {\n if (msg[0] == \"resolve\") {\n imp.resolve(new PayloadStubHook(new Evaluator(this).evaluate(msg[2])));\n } else {\n let payload = new Evaluator(this).evaluate(msg[2]);\n payload.dispose();\n imp.resolve(new ErrorStubHook(payload.value));\n }\n } else {\n if (msg[0] == \"resolve\") {\n new Evaluator(this).evaluate(msg[2]).dispose();\n }\n }\n continue;\n }\n break;\n }\n case \"release\": {\n let exportId = msg[1];\n let refcount = msg[2];\n if (typeof exportId == \"number\" && typeof refcount == \"number\") {\n this.releaseExport(exportId, refcount);\n continue;\n }\n break;\n }\n case \"abort\": {\n let payload = new Evaluator(this).evaluate(msg[1]);\n payload.dispose();\n this.abort(payload, false);\n break;\n }\n }\n }\n throw new Error(`bad RPC message: ${JSON.stringify(msg)}`);\n }\n }\n async drain() {\n if (this.abortReason) {\n throw this.abortReason;\n }\n if (this.pullCount > 0) {\n let { promise, resolve, reject } = Promise.withResolvers();\n this.onBatchDone = { resolve, reject };\n await promise;\n }\n }\n getStats() {\n let result = { imports: 0, exports: 0 };\n for (let i in this.imports) {\n ++result.imports;\n }\n for (let i in this.exports) {\n ++result.exports;\n }\n return result;\n }\n};\nvar RpcSession = class {\n #session;\n #mainStub;\n constructor(transport, localMain, options = {}) {\n let mainHook;\n if (localMain) {\n mainHook = new PayloadStubHook(RpcPayload.fromAppReturn(localMain));\n } else {\n mainHook = new ErrorStubHook(new Error(\"This connection has no main object.\"));\n }\n this.#session = new RpcSessionImpl(transport, mainHook, options);\n this.#mainStub = new RpcStub(this.#session.getMainImport());\n }\n getRemoteMain() {\n return this.#mainStub;\n }\n getStats() {\n return this.#session.getStats();\n }\n drain() {\n return this.#session.drain();\n }\n};\nfunction newWebSocketRpcSession(webSocket, localMain, options) {\n if (typeof webSocket === \"string\") {\n webSocket = new WebSocket(webSocket);\n }\n let transport = new WebSocketTransport(webSocket);\n let rpc = new RpcSession(transport, localMain, options);\n return rpc.getRemoteMain();\n}\nfunction newWorkersWebSocketRpcResponse(request, localMain, options) {\n if (request.headers.get(\"Upgrade\")?.toLowerCase() !== \"websocket\") {\n return new Response(\"This endpoint only accepts WebSocket requests.\", { status: 400 });\n }\n let pair = new WebSocketPair();\n let server = pair[0];\n server.accept();\n newWebSocketRpcSession(server, localMain, options);\n return new Response(null, {\n status: 101,\n webSocket: pair[1]\n });\n}\nvar WebSocketTransport = class {\n constructor(webSocket) {\n this.#webSocket = webSocket;\n if (webSocket.readyState === WebSocket.CONNECTING) {\n this.#sendQueue = [];\n webSocket.addEventListener(\"open\", (event) => {\n try {\n for (let message of this.#sendQueue) {\n webSocket.send(message);\n }\n } catch (err) {\n this.#receivedError(err);\n }\n this.#sendQueue = void 0;\n });\n }\n webSocket.addEventListener(\"message\", (event) => {\n if (this.#error) ;\n else if (typeof event.data === \"string\") {\n if (this.#receiveResolver) {\n this.#receiveResolver(event.data);\n this.#receiveResolver = void 0;\n this.#receiveRejecter = void 0;\n } else {\n this.#receiveQueue.push(event.data);\n }\n } else {\n this.#receivedError(new TypeError(\"Received non-string message from WebSocket.\"));\n }\n });\n webSocket.addEventListener(\"close\", (event) => {\n this.#receivedError(new Error(`Peer closed WebSocket: ${event.code} ${event.reason}`));\n });\n webSocket.addEventListener(\"error\", (event) => {\n this.#receivedError(new Error(`WebSocket connection failed.`));\n });\n }\n #webSocket;\n #sendQueue;\n // only if not opened yet\n #receiveResolver;\n #receiveRejecter;\n #receiveQueue = [];\n #error;\n async send(message) {\n if (this.#sendQueue === void 0) {\n this.#webSocket.send(message);\n } else {\n this.#sendQueue.push(message);\n }\n }\n async receive() {\n if (this.#receiveQueue.length > 0) {\n return this.#receiveQueue.shift();\n } else if (this.#error) {\n throw this.#error;\n } else {\n return new Promise((resolve, reject) => {\n this.#receiveResolver = resolve;\n this.#receiveRejecter = reject;\n });\n }\n }\n abort(reason) {\n let message;\n if (reason instanceof Error) {\n message = reason.message;\n } else {\n message = `${reason}`;\n }\n this.#webSocket.close(3e3, message);\n if (!this.#error) {\n this.#error = reason;\n }\n }\n #receivedError(reason) {\n if (!this.#error) {\n this.#error = reason;\n if (this.#receiveRejecter) {\n this.#receiveRejecter(reason);\n this.#receiveResolver = void 0;\n this.#receiveRejecter = void 0;\n }\n }\n }\n};\nvar BatchServerTransport = class {\n constructor(batch) {\n this.#batchToReceive = batch;\n }\n #batchToSend = [];\n #batchToReceive;\n #allReceived = Promise.withResolvers();\n async send(message) {\n this.#batchToSend.push(message);\n }\n async receive() {\n let msg = this.#batchToReceive.shift();\n if (msg !== void 0) {\n return msg;\n } else {\n this.#allReceived.resolve();\n return new Promise((r) => {\n });\n }\n }\n abort(reason) {\n this.#allReceived.reject(reason);\n }\n whenAllReceived() {\n return this.#allReceived.promise;\n }\n getResponseBody() {\n return this.#batchToSend.join(\"\\n\");\n }\n};\nasync function newHttpBatchRpcResponse(request, localMain, options) {\n if (request.method !== \"POST\") {\n return new Response(\"This endpoint only accepts POST requests.\", { status: 405 });\n }\n let body = await request.text();\n let batch = body === \"\" ? [] : body.split(\"\\n\");\n let transport = new BatchServerTransport(batch);\n let rpc = new RpcSession(transport, localMain, options);\n await transport.whenAllReceived();\n await rpc.drain();\n return new Response(transport.getResponseBody());\n}\nvar currentMapBuilder;\nvar MapBuilder = class {\n context;\n captureMap = /* @__PURE__ */ new Map();\n instructions = [];\n constructor(subject, path) {\n if (currentMapBuilder) {\n this.context = {\n parent: currentMapBuilder,\n captures: [],\n subject: currentMapBuilder.capture(subject),\n path\n };\n } else {\n this.context = {\n parent: void 0,\n captures: [],\n subject,\n path\n };\n }\n currentMapBuilder = this;\n }\n unregister() {\n currentMapBuilder = this.context.parent;\n }\n makeInput() {\n return new MapVariableHook(this, 0);\n }\n makeOutput(result) {\n let devalued;\n try {\n devalued = Devaluator.devaluate(result.value, void 0, this, result);\n } finally {\n result.dispose();\n }\n this.instructions.push(devalued);\n if (this.context.parent) {\n this.context.parent.instructions.push(\n [\n \"remap\",\n this.context.subject,\n this.context.path,\n this.context.captures.map((cap) => [\"import\", cap]),\n this.instructions\n ]\n );\n return new MapVariableHook(this.context.parent, this.context.parent.instructions.length);\n } else {\n return this.context.subject.map(this.context.path, this.context.captures, this.instructions);\n }\n }\n pushCall(hook, path, params) {\n let devalued = Devaluator.devaluate(params.value, void 0, this, params);\n devalued = devalued[0];\n let subject = this.capture(hook.dup());\n this.instructions.push([\"pipeline\", subject, path, devalued]);\n return new MapVariableHook(this, this.instructions.length);\n }\n pushGet(hook, path) {\n let subject = this.capture(hook.dup());\n this.instructions.push([\"pipeline\", subject, path]);\n return new MapVariableHook(this, this.instructions.length);\n }\n capture(hook) {\n if (hook instanceof MapVariableHook && hook.mapper === this) {\n return hook.idx;\n }\n let result = this.captureMap.get(hook);\n if (result === void 0) {\n if (this.context.parent) {\n let parentIdx = this.context.parent.capture(hook);\n this.context.captures.push(parentIdx);\n } else {\n this.context.captures.push(hook);\n }\n result = -this.context.captures.length;\n this.captureMap.set(hook, result);\n }\n return result;\n }\n // ---------------------------------------------------------------------------\n // implements Exporter\n exportStub(hook) {\n throw new Error(\n \"Can't construct an RpcTarget or RPC callback inside a mapper function. Try creating a new RpcStub outside the callback first, then using it inside the callback.\"\n );\n }\n exportPromise(hook) {\n return this.exportStub(hook);\n }\n getImport(hook) {\n return this.capture(hook);\n }\n unexport(ids) {\n }\n createPipe(readable) {\n throw new Error(\"Cannot send ReadableStream inside a mapper function.\");\n }\n onSendError(error) {\n }\n};\nmapImpl.sendMap = (hook, path, func) => {\n let builder = new MapBuilder(hook, path);\n let result;\n try {\n result = RpcPayload.fromAppReturn(withCallInterceptor(builder.pushCall.bind(builder), () => {\n return func(new RpcPromise(builder.makeInput(), []));\n }));\n } finally {\n builder.unregister();\n }\n if (result instanceof Promise) {\n result.catch((err) => {\n });\n throw new Error(\"RPC map() callbacks cannot be async.\");\n }\n return new RpcPromise(builder.makeOutput(result), []);\n};\nfunction throwMapperBuilderUseError() {\n throw new Error(\n \"Attempted to use an abstract placeholder from a mapper function. Please make sure your map function has no side effects.\"\n );\n}\nvar MapVariableHook = class extends StubHook {\n constructor(mapper, idx) {\n super();\n this.mapper = mapper;\n this.idx = idx;\n }\n // We don't have anything we actually need to dispose, so dup() can just return the same hook.\n dup() {\n return this;\n }\n dispose() {\n }\n get(path) {\n if (path.length == 0) {\n return this;\n } else if (currentMapBuilder) {\n return currentMapBuilder.pushGet(this, path);\n } else {\n throwMapperBuilderUseError();\n }\n }\n // Other methods should never be called.\n call(path, args) {\n throwMapperBuilderUseError();\n }\n map(path, captures, instructions) {\n throwMapperBuilderUseError();\n }\n pull() {\n throwMapperBuilderUseError();\n }\n ignoreUnhandledRejections() {\n }\n onBroken(callback) {\n throwMapperBuilderUseError();\n }\n};\nvar MapApplicator = class {\n constructor(captures, input) {\n this.captures = captures;\n this.variables = [input];\n }\n variables;\n dispose() {\n for (let variable of this.variables) {\n variable.dispose();\n }\n }\n apply(instructions) {\n try {\n if (instructions.length < 1) {\n throw new Error(\"Invalid empty mapper function.\");\n }\n for (let instruction of instructions.slice(0, -1)) {\n let payload = new Evaluator(this).evaluateCopy(instruction);\n if (payload.value instanceof RpcStub) {\n let hook = unwrapStubNoProperties(payload.value);\n if (hook) {\n this.variables.push(hook);\n continue;\n }\n }\n this.variables.push(new PayloadStubHook(payload));\n }\n return new Evaluator(this).evaluateCopy(instructions[instructions.length - 1]);\n } finally {\n for (let variable of this.variables) {\n variable.dispose();\n }\n }\n }\n importStub(idx) {\n throw new Error(\"A mapper function cannot refer to exports.\");\n }\n importPromise(idx) {\n return this.importStub(idx);\n }\n getExport(idx) {\n if (idx < 0) {\n return this.captures[-idx - 1];\n } else {\n return this.variables[idx];\n }\n }\n getPipeReadable(exportId) {\n throw new Error(\"A mapper function cannot use pipe readables.\");\n }\n};\nfunction applyMapToElement(input, parent, owner, captures, instructions) {\n let inputHook = new PayloadStubHook(RpcPayload.deepCopyFrom(input, parent, owner));\n let mapper = new MapApplicator(captures, inputHook);\n try {\n return mapper.apply(instructions);\n } finally {\n mapper.dispose();\n }\n}\nmapImpl.applyMap = (input, parent, owner, captures, instructions) => {\n try {\n let result;\n if (input instanceof RpcPromise) {\n throw new Error(\"applyMap() can't be called on RpcPromise\");\n } else if (input instanceof Array) {\n let payloads = [];\n try {\n for (let elem of input) {\n payloads.push(applyMapToElement(elem, input, owner, captures, instructions));\n }\n } catch (err) {\n for (let payload of payloads) {\n payload.dispose();\n }\n throw err;\n }\n result = RpcPayload.fromArray(payloads);\n } else if (input === null || input === void 0) {\n result = RpcPayload.fromAppReturn(input);\n } else {\n result = applyMapToElement(input, parent, owner, captures, instructions);\n }\n return new PayloadStubHook(result);\n } finally {\n for (let cap of captures) {\n cap.dispose();\n }\n }\n};\nvar WritableStreamStubHook = class _WritableStreamStubHook extends StubHook {\n state;\n // undefined when disposed\n // Creates a new WritableStreamStubHook that is not duplicated from an existing hook.\n static create(stream) {\n let writer = stream.getWriter();\n return new _WritableStreamStubHook({ refcount: 1, writer, closed: false });\n }\n constructor(state, dupFrom) {\n super();\n this.state = state;\n if (dupFrom) {\n ++state.refcount;\n }\n }\n getState() {\n if (this.state) {\n return this.state;\n } else {\n throw new Error(\"Attempted to use a WritableStreamStubHook after it was disposed.\");\n }\n }\n call(path, args) {\n try {\n let state = this.getState();\n if (path.length !== 1 || typeof path[0] !== \"string\") {\n throw new Error(\"WritableStream stub only supports direct method calls\");\n }\n const method = path[0];\n if (method !== \"write\" && method !== \"close\" && method !== \"abort\") {\n args.dispose();\n throw new Error(`Unknown WritableStream method: ${method}`);\n }\n if (method === \"close\" || method === \"abort\") {\n state.closed = true;\n }\n let func = state.writer[method];\n let promise = args.deliverCall(func, state.writer);\n return new PromiseStubHook(promise.then((payload) => new PayloadStubHook(payload)));\n } catch (err) {\n return new ErrorStubHook(err);\n }\n }\n map(path, captures, instructions) {\n for (let cap of captures) {\n cap.dispose();\n }\n return new ErrorStubHook(new Error(\"Cannot use map() on a WritableStream\"));\n }\n get(path) {\n return new ErrorStubHook(new Error(\"Cannot access properties on a WritableStream stub\"));\n }\n dup() {\n let state = this.getState();\n return new _WritableStreamStubHook(state, this);\n }\n pull() {\n return Promise.reject(new Error(\"Cannot pull a WritableStream stub\"));\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n let state = this.state;\n this.state = void 0;\n if (state) {\n if (--state.refcount === 0) {\n if (!state.closed) {\n state.writer.abort(new Error(\"WritableStream RPC stub was disposed without calling close()\")).catch(() => {\n });\n }\n state.writer.releaseLock();\n }\n }\n }\n onBroken(callback) {\n }\n};\nvar INITIAL_WINDOW = 256 * 1024;\nvar MAX_WINDOW = 1024 * 1024 * 1024;\nvar MIN_WINDOW = 64 * 1024;\nvar STARTUP_GROWTH_FACTOR = 2;\nvar STEADY_GROWTH_FACTOR = 1.25;\nvar DECAY_FACTOR = 0.9;\nvar STARTUP_EXIT_ROUNDS = 3;\nvar FlowController = class {\n constructor(now) {\n this.now = now;\n }\n // The current window size in bytes. The sender blocks when bytesInFlight >= window.\n window = INITIAL_WINDOW;\n // Total bytes currently in flight (sent but not yet acked).\n bytesInFlight = 0;\n // Whether we're still in the startup phase.\n inStartupPhase = true;\n // ----- BDP estimation state (private) -----\n // Total bytes acked so far.\n delivered = 0;\n // Time of most recent ack.\n deliveredTime = 0;\n // Time when the very first ack was received.\n firstAckTime = 0;\n firstAckDelivered = 0;\n // Global minimum RTT observed (milliseconds).\n minRtt = Infinity;\n // For startup exit: count of consecutive RTT rounds where the window didn't meaningfully grow.\n roundsWithoutIncrease = 0;\n // Window size at the start of the current round, for startup exit detection.\n lastRoundWindow = 0;\n // Time when the current round started.\n roundStartTime = 0;\n // Called when a write of `size` bytes is about to be sent. Returns a token that must be\n // passed to onAck() when the ack arrives, and whether the sender should block (window full).\n onSend(size) {\n this.bytesInFlight += size;\n let token = {\n sentTime: this.now(),\n size,\n deliveredAtSend: this.delivered,\n deliveredTimeAtSend: this.deliveredTime,\n windowAtSend: this.window,\n windowFullAtSend: this.bytesInFlight >= this.window\n };\n return { token, shouldBlock: token.windowFullAtSend };\n }\n // Called when a previously-sent write fails. Restores bytesInFlight without updating\n // any BDP estimates.\n onError(token) {\n this.bytesInFlight -= token.size;\n }\n // Called when an ack is received for a previously-sent write. Updates BDP estimates and\n // the window. Returns whether a blocked sender should now unblock.\n onAck(token) {\n let ackTime = this.now();\n this.delivered += token.size;\n this.deliveredTime = ackTime;\n this.bytesInFlight -= token.size;\n let rtt = ackTime - token.sentTime;\n this.minRtt = Math.min(this.minRtt, rtt);\n if (this.firstAckTime === 0) {\n this.firstAckTime = ackTime;\n this.firstAckDelivered = this.delivered;\n } else {\n let baseTime;\n let baseDelivered;\n if (token.deliveredTimeAtSend === 0) {\n baseTime = this.firstAckTime;\n baseDelivered = this.firstAckDelivered;\n } else {\n baseTime = token.deliveredTimeAtSend;\n baseDelivered = token.deliveredAtSend;\n }\n let interval = ackTime - baseTime;\n let bytes = this.delivered - baseDelivered;\n let bandwidth = bytes / interval;\n let growthFactor = this.inStartupPhase ? STARTUP_GROWTH_FACTOR : STEADY_GROWTH_FACTOR;\n let newWindow = bandwidth * this.minRtt * growthFactor;\n newWindow = Math.min(newWindow, token.windowAtSend * growthFactor);\n if (token.windowFullAtSend) {\n newWindow = Math.max(newWindow, token.windowAtSend * DECAY_FACTOR);\n } else {\n newWindow = Math.max(newWindow, this.window);\n }\n this.window = Math.max(Math.min(newWindow, MAX_WINDOW), MIN_WINDOW);\n if (this.inStartupPhase && token.sentTime >= this.roundStartTime) {\n if (this.window > this.lastRoundWindow * STEADY_GROWTH_FACTOR) {\n this.roundsWithoutIncrease = 0;\n } else {\n if (++this.roundsWithoutIncrease >= STARTUP_EXIT_ROUNDS) {\n this.inStartupPhase = false;\n }\n }\n this.roundStartTime = ackTime;\n this.lastRoundWindow = this.window;\n }\n }\n return this.bytesInFlight < this.window;\n }\n};\nfunction createWritableStreamFromHook(hook) {\n let pendingError = void 0;\n let hookDisposed = false;\n let fc = new FlowController(() => performance.now());\n let windowResolve;\n let windowReject;\n const disposeHook = () => {\n if (!hookDisposed) {\n hookDisposed = true;\n hook.dispose();\n }\n };\n return new WritableStream({\n write(chunk, controller) {\n if (pendingError !== void 0) {\n throw pendingError;\n }\n const payload = RpcPayload.fromAppParams([chunk]);\n const { promise, size } = hook.stream([\"write\"], payload);\n if (size === void 0) {\n return promise.catch((err) => {\n if (pendingError === void 0) {\n pendingError = err;\n }\n throw err;\n });\n } else {\n let { token, shouldBlock } = fc.onSend(size);\n promise.then(() => {\n let hasCapacity = fc.onAck(token);\n if (hasCapacity && windowResolve) {\n windowResolve();\n windowResolve = void 0;\n windowReject = void 0;\n }\n }, (err) => {\n fc.onError(token);\n if (pendingError === void 0) {\n pendingError = err;\n controller.error(err);\n disposeHook();\n }\n if (windowReject) {\n windowReject(err);\n windowResolve = void 0;\n windowReject = void 0;\n }\n });\n if (shouldBlock) {\n return new Promise((resolve, reject) => {\n windowResolve = resolve;\n windowReject = reject;\n });\n }\n }\n },\n async close() {\n if (pendingError !== void 0) {\n disposeHook();\n throw pendingError;\n }\n const { promise } = hook.stream([\"close\"], RpcPayload.fromAppParams([]));\n try {\n await promise;\n } catch (err) {\n throw pendingError ?? err;\n } finally {\n disposeHook();\n }\n },\n abort(reason) {\n if (pendingError !== void 0) {\n return;\n }\n pendingError = reason ?? new Error(\"WritableStream was aborted\");\n if (windowReject) {\n windowReject(pendingError);\n windowResolve = void 0;\n windowReject = void 0;\n }\n const { promise } = hook.stream([\"abort\"], RpcPayload.fromAppParams([reason]));\n promise.then(() => disposeHook(), () => disposeHook());\n }\n });\n}\nvar ReadableStreamStubHook = class _ReadableStreamStubHook extends StubHook {\n state;\n // undefined when disposed\n // Creates a new ReadableStreamStubHook.\n static create(stream) {\n return new _ReadableStreamStubHook({ refcount: 1, stream, canceled: false });\n }\n constructor(state, dupFrom) {\n super();\n this.state = state;\n if (dupFrom) {\n ++state.refcount;\n }\n }\n call(path, args) {\n args.dispose();\n return new ErrorStubHook(new Error(\"Cannot call methods on a ReadableStream stub\"));\n }\n map(path, captures, instructions) {\n for (let cap of captures) {\n cap.dispose();\n }\n return new ErrorStubHook(new Error(\"Cannot use map() on a ReadableStream\"));\n }\n get(path) {\n return new ErrorStubHook(new Error(\"Cannot access properties on a ReadableStream stub\"));\n }\n dup() {\n let state = this.state;\n if (!state) {\n throw new Error(\"Attempted to dup a ReadableStreamStubHook after it was disposed.\");\n }\n return new _ReadableStreamStubHook(state, this);\n }\n pull() {\n return Promise.reject(new Error(\"Cannot pull a ReadableStream stub\"));\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n let state = this.state;\n this.state = void 0;\n if (state) {\n if (--state.refcount === 0) {\n if (!state.canceled) {\n state.canceled = true;\n if (!state.stream.locked) {\n state.stream.cancel(\n new Error(\"ReadableStream RPC stub was disposed without being consumed\")\n ).catch(() => {\n });\n }\n }\n }\n }\n }\n onBroken(callback) {\n }\n};\nstreamImpl.createWritableStreamHook = WritableStreamStubHook.create;\nstreamImpl.createWritableStreamFromHook = createWritableStreamFromHook;\nstreamImpl.createReadableStreamHook = ReadableStreamStubHook.create;\nasync function newWorkersRpcResponse(request, localMain) {\n if (request.method === \"POST\") {\n let response = await newHttpBatchRpcResponse(request, localMain);\n response.headers.set(\"Access-Control-Allow-Origin\", \"*\");\n return response;\n } else if (request.headers.get(\"Upgrade\")?.toLowerCase() === \"websocket\") {\n return newWorkersWebSocketRpcResponse(request, localMain);\n } else {\n return new Response(\"This endpoint only accepts POST or WebSocket requests.\", { status: 400 });\n }\n}\n\n// templates/remoteBindings/ProxyServerWorker.ts\nimport { EmailMessage } from \"cloudflare:email\";\nvar BindingNotFoundError = class extends Error {\n constructor(name) {\n super(`Binding ${name ? `\"${name}\"` : \"\"} not found`);\n }\n};\nfunction getExposedJSRPCBinding(request, env) {\n const url = new URL(request.url);\n const bindingName = url.searchParams.get(\"MF-Binding\");\n if (!bindingName) {\n throw new BindingNotFoundError();\n }\n const targetBinding = env[bindingName];\n if (!targetBinding) {\n throw new BindingNotFoundError(bindingName);\n }\n if (targetBinding.constructor.name === \"SendEmail\") {\n return {\n async send(e) {\n if (\"EmailMessage::raw\" in e) {\n const message = new EmailMessage(\n e.from,\n e.to,\n e[\"EmailMessage::raw\"]\n );\n return targetBinding.send(message);\n } else {\n return targetBinding.send(e);\n }\n }\n };\n }\n if (url.searchParams.has(\"MF-Dispatch-Namespace-Options\")) {\n const { name, args, options } = JSON.parse(\n url.searchParams.get(\"MF-Dispatch-Namespace-Options\")\n );\n return targetBinding.get(name, args, options);\n }\n return targetBinding;\n}\nfunction getExposedFetcher(request, env) {\n const bindingName = request.headers.get(\"MF-Binding\");\n if (!bindingName) {\n throw new BindingNotFoundError();\n }\n const targetBinding = env[bindingName];\n if (!targetBinding) {\n throw new BindingNotFoundError(bindingName);\n }\n const dispatchNamespaceOptions = request.headers.get(\n \"MF-Dispatch-Namespace-Options\"\n );\n if (dispatchNamespaceOptions) {\n const { name, args, options } = JSON.parse(dispatchNamespaceOptions);\n return targetBinding.get(name, args, options);\n }\n return targetBinding;\n}\nfunction isJSRPCBinding(request) {\n const url = new URL(request.url);\n return request.headers.has(\"Upgrade\") && url.searchParams.has(\"MF-Binding\");\n}\nvar ProxyServerWorker_default = {\n async fetch(request, env) {\n try {\n if (isJSRPCBinding(request)) {\n return newWorkersRpcResponse(\n request,\n getExposedJSRPCBinding(request, env)\n );\n } else {\n const fetcher = getExposedFetcher(request, env);\n const originalHeaders = new Headers();\n for (const [name, value] of request.headers) {\n if (name.startsWith(\"mf-header-\")) {\n originalHeaders.set(name.slice(\"mf-header-\".length), value);\n } else if (name === \"upgrade\") {\n originalHeaders.set(name, value);\n }\n }\n return fetcher.fetch(\n request.headers.get(\"MF-URL\") ?? \"http://example.com\",\n new Request(request, {\n redirect: \"manual\",\n headers: originalHeaders\n })\n );\n }\n } catch (e) {\n if (e instanceof BindingNotFoundError) {\n return new Response(e.message, { status: 400 });\n }\n return new Response(e.message, { status: 500 });\n }\n }\n};\nexport {\n ProxyServerWorker_default as default\n};\n", "import type { Middleware } from \"./common\";\n\nconst drainBody: Middleware = async (request, env, _ctx, middlewareCtx) => {\n\ttry {\n\t\treturn await middlewareCtx.next(request, env);\n\t} finally {\n\t\ttry {\n\t\t\tif (request.body !== null && !request.bodyUsed) {\n\t\t\t\tconst reader = request.body.getReader();\n\t\t\t\twhile (!(await reader.read()).done) {}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Failed to drain the unused request body.\", e);\n\t\t}\n\t}\n};\n\nexport default drainBody;\n", "\t\t\t\timport worker, * as OTHER_EXPORTS from \"/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/wrangler-dist/ProxyServerWorker.js\";\n\t\t\t\timport * as __MIDDLEWARE_0__ from \"/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts\";\n\n\t\t\t\texport * from \"/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/wrangler-dist/ProxyServerWorker.js\";\n\t\t\t\tconst MIDDLEWARE_TEST_INJECT = \"__INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__\";\n\t\t\t\texport const __INTERNAL_WRANGLER_MIDDLEWARE__ = [\n\t\t\t\t\t\n\t\t\t\t\t__MIDDLEWARE_0__.default\n\t\t\t\t]\n\t\t\t\texport default worker;", "export type Awaitable = T | Promise;\n// TODO: allow dispatching more events?\nexport type Dispatcher = (\n\ttype: \"scheduled\",\n\tinit: { cron?: string }\n) => Awaitable;\n\nexport type IncomingRequest = Request<\n\tunknown,\n\tIncomingRequestCfProperties\n>;\n\nexport interface MiddlewareContext {\n\tdispatch: Dispatcher;\n\tnext(request: IncomingRequest, env: any): Awaitable;\n}\n\nexport type Middleware = (\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tmiddlewareCtx: MiddlewareContext\n) => Awaitable;\n\nconst __facade_middleware__: Middleware[] = [];\n\n// The register functions allow for the insertion of one or many middleware,\n// We register internal middleware first in the stack, but have no way of controlling\n// the order that addMiddleware is run in service workers so need an internal function.\nexport function __facade_register__(...args: (Middleware | Middleware[])[]) {\n\t__facade_middleware__.push(...args.flat());\n}\nexport function __facade_registerInternal__(\n\t...args: (Middleware | Middleware[])[]\n) {\n\t__facade_middleware__.unshift(...args.flat());\n}\n\nfunction __facade_invokeChain__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tmiddlewareChain: Middleware[]\n): Awaitable {\n\tconst [head, ...tail] = middlewareChain;\n\tconst middlewareCtx: MiddlewareContext = {\n\t\tdispatch,\n\t\tnext(newRequest, newEnv) {\n\t\t\treturn __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);\n\t\t},\n\t};\n\treturn head(request, env, ctx, middlewareCtx);\n}\n\nexport function __facade_invoke__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tfinalMiddleware: Middleware\n): Awaitable {\n\treturn __facade_invokeChain__(request, env, ctx, dispatch, [\n\t\t...__facade_middleware__,\n\t\tfinalMiddleware,\n\t]);\n}\n", "// This loads all middlewares exposed on the middleware object and then starts\n// the invocation chain. The big idea is that we can add these to the middleware\n// export dynamically through wrangler, or we can potentially let users directly\n// add them as a sort of \"plugin\" system.\n\nimport ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from \"/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js\";\nimport { __facade_invoke__, __facade_register__, Dispatcher } from \"/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/templates/middleware/common.ts\";\nimport type { WorkerEntrypointConstructor } from \"/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js\";\n\n// Preserve all the exports from the worker\nexport * from \"/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js\";\n\nclass __Facade_ScheduledController__ implements ScheduledController {\n\treadonly #noRetry: ScheduledController[\"noRetry\"];\n\n\tconstructor(\n\t\treadonly scheduledTime: number,\n\t\treadonly cron: string,\n\t\tnoRetry: ScheduledController[\"noRetry\"]\n\t) {\n\t\tthis.#noRetry = noRetry;\n\t}\n\n\tnoRetry() {\n\t\tif (!(this instanceof __Facade_ScheduledController__)) {\n\t\t\tthrow new TypeError(\"Illegal invocation\");\n\t\t}\n\t\t// Need to call native method immediately in case uncaught error thrown\n\t\tthis.#noRetry();\n\t}\n}\n\nfunction wrapExportedHandler(worker: ExportedHandler): ExportedHandler {\n\t// If we don't have any middleware defined, just return the handler as is\n\tif (\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0\n\t) {\n\t\treturn worker;\n\t}\n\t// Otherwise, register all middleware once\n\tfor (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {\n\t\t__facade_register__(middleware);\n\t}\n\n\tconst fetchDispatcher: ExportedHandlerFetchHandler = function (\n\t\trequest,\n\t\tenv,\n\t\tctx\n\t) {\n\t\tif (worker.fetch === undefined) {\n\t\t\tthrow new Error(\"Handler does not export a fetch() function.\");\n\t\t}\n\t\treturn worker.fetch(request, env, ctx);\n\t};\n\n\treturn {\n\t\t...worker,\n\t\tfetch(request, env, ctx) {\n\t\t\tconst dispatcher: Dispatcher = function (type, init) {\n\t\t\t\tif (type === \"scheduled\" && worker.scheduled !== undefined) {\n\t\t\t\t\tconst controller = new __Facade_ScheduledController__(\n\t\t\t\t\t\tDate.now(),\n\t\t\t\t\t\tinit.cron ?? \"\",\n\t\t\t\t\t\t() => {}\n\t\t\t\t\t);\n\t\t\t\t\treturn worker.scheduled(controller, env, ctx);\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);\n\t\t},\n\t};\n}\n\nfunction wrapWorkerEntrypoint(\n\tklass: WorkerEntrypointConstructor\n): WorkerEntrypointConstructor {\n\t// If we don't have any middleware defined, just return the handler as is\n\tif (\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0\n\t) {\n\t\treturn klass;\n\t}\n\t// Otherwise, register all middleware once\n\tfor (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {\n\t\t__facade_register__(middleware);\n\t}\n\n\t// `extend`ing `klass` here so other RPC methods remain callable\n\treturn class extends klass {\n\t\t#fetchDispatcher: ExportedHandlerFetchHandler> = (\n\t\t\trequest,\n\t\t\tenv,\n\t\t\tctx\n\t\t) => {\n\t\t\tthis.env = env;\n\t\t\tthis.ctx = ctx;\n\t\t\tif (super.fetch === undefined) {\n\t\t\t\tthrow new Error(\"Entrypoint class does not define a fetch() function.\");\n\t\t\t}\n\t\t\treturn super.fetch(request);\n\t\t};\n\n\t\t#dispatcher: Dispatcher = (type, init) => {\n\t\t\tif (type === \"scheduled\" && super.scheduled !== undefined) {\n\t\t\t\tconst controller = new __Facade_ScheduledController__(\n\t\t\t\t\tDate.now(),\n\t\t\t\t\tinit.cron ?? \"\",\n\t\t\t\t\t() => {}\n\t\t\t\t);\n\t\t\t\treturn super.scheduled(controller);\n\t\t\t}\n\t\t};\n\n\t\tfetch(request: Request) {\n\t\t\treturn __facade_invoke__(\n\t\t\t\trequest,\n\t\t\t\tthis.env,\n\t\t\t\tthis.ctx,\n\t\t\t\tthis.#dispatcher,\n\t\t\t\tthis.#fetchDispatcher\n\t\t\t);\n\t\t}\n\t};\n}\n\nlet WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined;\nif (typeof ENTRY === \"object\") {\n\tWRAPPED_ENTRY = wrapExportedHandler(ENTRY);\n} else if (typeof ENTRY === \"function\") {\n\tWRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY);\n}\nexport default WRAPPED_ENTRY;\n"], + "mappings": "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", + "names": [] +} diff --git a/Prockfile b/Prockfile deleted file mode 100644 index 934c985..0000000 --- a/Prockfile +++ /dev/null @@ -1 +0,0 @@ -web: gunicorn -b 0.0.0.0:$PORT app.server:app \ No newline at end of file diff --git a/README.md b/README.md index 533b2b8..0deb15a 100644 --- a/README.md +++ b/README.md @@ -1,191 +1,113 @@ # ScholarAI -Open-source AI-powered research assistant designed to help students and scientists navigate large volumes of academic literature. Supports paper discovery, summarization, citation exploration, and question answering across research papers. Helps organize knowledge, identify trends, and accelerate literature review workflows. ---- - -## โœจ Features - -- PDF upload and indexing -- Retrieval-augmented question answering (RAG) -- Per-user data isolation (`user_id`) -- Local vector store with ChromaDB -- Simple web UI (HTML/CSS/JS) -- API-first backend (Flask) +Open-source AI-powered research assistant by Alpha One Labs. +Ask research questions, summarise papers, discover literature, and generate reviews โ€” +all powered by **Cloudflare Workers AI** (`@cf/meta/llama-3.1-8b-instruct`). --- -## ๐Ÿงฑ Tech Stack - -- **Frontend:** HTML, CSS, JavaScript -- **Backend:** Flask (Python) -- **RAG:** LangChain + ChromaDB (local) -- **LLM:** Google Gemini - ---- +## Project Structure -## ๐Ÿ“ Project Structure - -```text -app/ - server.py # Flask API + web routes - pipeline.py # Indexing + QA logic - templates/ - index.html # UI - static/ - style.css - app.js -temp/ # Temporary uploaded files +``` +scholarai/ +โ”œโ”€โ”€ src/ +โ”‚ โ””โ”€โ”€ worker.py # Single Python Worker โ€” routing + AI logic +โ”œโ”€โ”€ static/ +โ”‚ โ””โ”€โ”€ index.html # Full frontend (HTML/CSS/JS, no build step) +โ”œโ”€โ”€ wrangler.jsonc # Cloudflare Workers config +โ”œโ”€โ”€ package.json # npm scripts for Wrangler CLI +โ””โ”€โ”€ README.md ``` --- -## ๐Ÿš€ Quick Start (Linux) +## Quick Start -### 1) Clone and create virtual environment +### Prerequisites -```bash -git clone https://github.com/alphaonelabs/Alpha-one-labs-AI-research-assisstant.git -cd Alpha-one-labs-AI-research-assisstant -python3 -m venv venv -source venv/bin/activate -``` +- [Node.js](https://nodejs.org/) โ‰ฅ 18 +- A free [Cloudflare account](https://dash.cloudflare.com/sign-up) -### 2) Install dependencies +### 1. Install Wrangler ```bash -pip install -r requirements.txt +npm install +npx wrangler login ``` -### 3) Configure environment variables +### 2. Run locally ```bash -cp .env.example .env +npm run dev ``` -Set in `.env`: - -```env -GEMINI_API_KEY=your_key_here -``` +Opens at `http://localhost:8787`. -### 4) Run locally +### 3. Deploy ```bash -python -m app.server +npm run deploy ``` -If module run does not work in your setup: - -```bash -python app/server.py -``` - -Open: `http://127.0.0.1:5000` - --- -## ๐Ÿ”Œ API Endpoints +## API Endpoints -| Method | Endpoint | Description | -|---|---|---| -| `GET` | `/api/health` | Health check | -| `POST` | `/api/upload` | Upload + index PDF | -| `POST` | `/api/ask` | Ask a question | -| `DELETE` | `/api/user/` | Delete user indexed data | - -### `POST /api/upload` - -- Content-Type: `multipart/form-data` -- Fields: - - `pdf` (file) - - `user_id` (string) +| Method | Endpoint | Description | +|--------|-----------------|-------------------------------| +| GET | `/` | Serves the frontend HTML | +| GET | `/api/health` | Health check | +| POST | `/api/ask` | Ask a research question | +| POST | `/api/summarize`| Summarise a paper | +| POST | `/api/discover` | Discover relevant papers | +| POST | `/api/review` | Generate a literature review | ### `POST /api/ask` ```json -{ - "question": "What is the main contribution?", - "user_id": "user_abc123" -} +{ "question": "What is transfer learning?", "context": "(optional excerpt)" } ``` ---- +### `POST /api/summarize` -## ๐Ÿงช Basic cURL Examples - -```bash -curl -X GET http://127.0.0.1:5000/api/health +```json +{ "title": "...", "abstract": "...", "content": "..." } ``` -```bash -curl -X POST http://127.0.0.1:5000/api/upload \ - -F "pdf=@/path/to/paper.pdf" \ - -F "user_id=user_demo" -``` +At least one field required. -```bash -curl -X POST http://127.0.0.1:5000/api/ask \ - -H "Content-Type: application/json" \ - -d '{"question":"Summarize section 2","user_id":"user_demo"}' -``` +### `POST /api/discover` -```bash -curl -X DELETE http://127.0.0.1:5000/api/user/user_demo +```json +{ "query": "graph neural networks", "fields": ["ML", "biology"], "limit": 10 } ``` ---- - -## ๐Ÿค Contributing - -We welcome contributions from the community. - -1. Fork the repository -2. Create a feature branch - `git checkout -b feat/your-change` -3. Commit with clear messages -4. Open a Pull Request with: - - Problem statement - - What changed - - Screenshots/logs (if UI or behavior changed) +### `POST /api/review` -Please open an issue first for large changes. - ---- - -## โœ… PR Checklist +```json +{ "topic": "self-supervised learning", "style": "comprehensive", "audience": "researchers" } +``` -- [ ] Code runs locally -- [ ] Lint/tests pass -- [ ] No hardcoded secrets -- [ ] API/UI changes documented -- [ ] Small, focused PR +`style` options: `comprehensive`, `brief`, `systematic` --- -## ๐Ÿ›  Troubleshooting - -- **Upload returns 404:** frontend must call `POST /api/upload` (not `/upload`). -- **Upload says invalid file:** request field name must be `pdf` (not `file`). -- **Ask fails:** ensure `user_id` and `question` are both sent. -- **No model response:** verify `GEMINI_API_KEY` is set correctly. +## Contributing ---- +1. Fork the repo +2. Create a branch: `git checkout -b feat/your-change` +3. Commit and open a Pull Request with a clear description -## ๐Ÿ” Security - -- Do not commit `.env` or API keys. -- Rotate keys if exposed. -- Use `DELETE /api/user/` to remove user data. +Please open an issue first for large changes. --- -## ๐Ÿ“„ License +## License See [LICENSE](LICENSE). --- -## ๐Ÿ™Œ Maintained by +## Maintained by -**Alpha One Labs** -Open-source AI tooling for practical research workflows. \ No newline at end of file +**Alpha One Labs** โ€” open-source AI tooling for practical research workflows. \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/pipeline.py b/app/pipeline.py deleted file mode 100644 index 51ea7a2..0000000 --- a/app/pipeline.py +++ /dev/null @@ -1,124 +0,0 @@ -import os -from pathlib import Path -from dotenv import load_dotenv - -from langchain_community.document_loaders import PyPDFLoader -from langchain_text_splitters import RecursiveCharacterTextSplitter -from langchain_huggingface import HuggingFaceEmbeddings -from langchain_chroma import Chroma -from langchain_google_genai import ChatGoogleGenerativeAI -try: - from langchain_classic.chains import RetrievalQA -except Exception: - from langchain.chains import RetrievalQA - -try: - from langchain_core.prompts import PromptTemplate -except Exception: - from langchain.prompts import PromptTemplate - -load_dotenv() - -PROJECT_ROOT = Path(__file__).resolve().parents[1] -CHROMA_DIR = PROJECT_ROOT / "chroma_db" -CHROMA_DIR.mkdir(exist_ok=True) - -CHUNK_SIZE = int(os.getenv("CHUNK_SIZE", "1000")) -CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", "200")) -TOP_K_RESULTS = int(os.getenv("TOP_K_RESULTS", "5")) - -EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL", "sentence-transformers/all-MiniLM-L6-v2") -LLM_MODEL = os.getenv("LLM_MODEL", "gemini-2.5-flash-lite") -GEMINI_API_KEY = os.getenv("GEMINI_API_KEY", "") - -_embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL) -_llm = None - - -def _get_vectorstore() -> Chroma: - return Chroma( - collection_name="scholarai_docs", - embedding_function=_embeddings, - persist_directory=str(CHROMA_DIR), - ) - - -def _get_llm() -> ChatGoogleGenerativeAI: - global _llm - if not GEMINI_API_KEY: - raise RuntimeError("GEMINI_API_KEY is missing. Add it in .env") - if _llm is None: - _llm = ChatGoogleGenerativeAI( - model=LLM_MODEL, - google_api_key=GEMINI_API_KEY, - temperature=0.2, - ) - return _llm - - -def index_document(pdf_path: str, user_id: str) -> dict: - if not user_id: - raise ValueError("user_id is required") - if not Path(pdf_path).exists(): - raise FileNotFoundError(f"PDF not found: {pdf_path}") - - loader = PyPDFLoader(pdf_path) - docs = loader.load() - - splitter = RecursiveCharacterTextSplitter( - chunk_size=CHUNK_SIZE, - chunk_overlap=CHUNK_OVERLAP, - ) - chunks = splitter.split_documents(docs) - - for i, chunk in enumerate(chunks): - chunk.metadata["user_id"] = user_id - chunk.metadata["chunk_index"] = i - - vs = _get_vectorstore() - vs.add_documents(chunks) - - return {"chunks_indexed": len(chunks)} - - -def ask_question(question: str, user_id: str) -> str: - if not question.strip(): - raise ValueError("question is required") - if not user_id: - raise ValueError("user_id is required") - - retriever = _get_vectorstore().as_retriever( - search_kwargs={"k": TOP_K_RESULTS, "filter": {"user_id": user_id}} - ) - - prompt = PromptTemplate( - input_variables=["context", "question"], - template=( - "You are ScholarAI, a research assistant.\n" - "Answer only from the context below.\n" - "If answer is not in context, say: " - "'I could not find this in the uploaded documents.'\n\n" - "Context:\n{context}\n\n" - "Question: {question}\n" - "Answer:" - ), - ) - - qa = RetrievalQA.from_chain_type( - llm=_get_llm(), - chain_type="stuff", - retriever=retriever, - chain_type_kwargs={"prompt": prompt}, - return_source_documents=False, - ) - - result = qa.invoke({"query": question}) - return result["result"] - - -def delete_user_data(user_id: str) -> dict: - if not user_id: - raise ValueError("user_id is required") - vs = _get_vectorstore() - vs._collection.delete(where={"user_id": user_id}) - return {"deleted": True, "user_id": user_id} \ No newline at end of file diff --git a/app/server.py b/app/server.py deleted file mode 100644 index 9f5b510..0000000 --- a/app/server.py +++ /dev/null @@ -1,83 +0,0 @@ -import os -import uuid -from pathlib import Path - -from flask import Flask, jsonify, render_template, request -from werkzeug.utils import secure_filename - -try: - from app.pipeline import index_document, ask_question, delete_user_data -except Exception: - from pipeline import index_document, ask_question, delete_user_data - -BASE_DIR = Path(__file__).resolve().parent -TEMP_DIR = BASE_DIR.parent / "temp" -TEMP_DIR.mkdir(exist_ok=True) - -app = Flask( - __name__, - template_folder=str(BASE_DIR / "templates"), - static_folder=str(BASE_DIR / "static"), -) - - -@app.get("/") -def home(): - return render_template("index.html") - - -@app.get("/api/health") -def health(): - return jsonify({"ok": True, "service": "scholarai-mvp"}) - - -@app.post("/api/upload") -def upload_pdf(): - pdf = request.files.get("pdf") - user_id = request.form.get("user_id", "").strip() - - if not user_id: - return jsonify({"ok": False, "error": "user_id is required"}), 400 - if not pdf or not pdf.filename.lower().endswith(".pdf"): - return jsonify({"ok": False, "error": "Valid PDF file is required"}), 400 - - temp_file = TEMP_DIR / f"{uuid.uuid4()}_{secure_filename(pdf.filename)}" - pdf.save(temp_file) - - try: - meta = index_document(str(temp_file), user_id=user_id) - return jsonify({"ok": True, "message": "PDF indexed", **meta}) - except Exception as e: - return jsonify({"ok": False, "error": str(e)}), 500 - finally: - if temp_file.exists(): - temp_file.unlink(missing_ok=True) - - -@app.post("/api/ask") -def ask(): - data = request.get_json(silent=True) or {} - question = (data.get("question") or "").strip() - user_id = (data.get("user_id") or "").strip() - - if not user_id or not question: - return jsonify({"ok": False, "error": "user_id and question are required"}), 400 - - try: - answer = ask_question(question, user_id=user_id) - return jsonify({"ok": True, "answer": answer}) - except Exception as e: - return jsonify({"ok": False, "error": str(e)}), 500 - - -@app.delete("/api/user/") -def delete_user(user_id: str): - try: - data = delete_user_data(user_id) - return jsonify({"ok": True, **data}) - except Exception as e: - return jsonify({"ok": False, "error": str(e)}), 500 - - -if __name__ == "__main__": - app.run(host="0.0.0.0", port=int(os.getenv("PORT", "5000")), debug=True) \ No newline at end of file diff --git a/app/static/app.js b/app/static/app.js deleted file mode 100644 index 41dc724..0000000 --- a/app/static/app.js +++ /dev/null @@ -1,151 +0,0 @@ -(function () { - const API_BASE = "/api"; - - const userIdInput = document.getElementById("userId"); - const uploadForm = document.getElementById("uploadForm"); - const askForm = document.getElementById("askForm"); - const deleteBtn = document.getElementById("deleteData"); - const statusEl = document.getElementById("status"); - const answerBox = document.getElementById("answerBox"); - - function getOrCreateUserId() { - let id = localStorage.getItem("scholar_user_id"); - if (!id) { - id = (window.crypto && crypto.randomUUID) - ? `user_${crypto.randomUUID()}` - : `user_${Math.random().toString(36).slice(2, 10)}_${Date.now()}`; - localStorage.setItem("scholar_user_id", id); - } - if (userIdInput) userIdInput.value = id; - return id; - } - - function currentUserId() { - return userIdInput?.value || getOrCreateUserId(); - } - - function setStatus(msg, isError = false) { - if (!statusEl) return; - statusEl.textContent = msg || ""; - statusEl.style.color = isError ? "#f87171" : "#94a3b8"; - } - - async function safeJson(res) { - try { - return await res.json(); - } catch { - return {}; - } - } - - getOrCreateUserId(); - - uploadForm?.addEventListener("submit", async (e) => { - e.preventDefault(); - - const fileInput = document.getElementById("pdfFile"); - const file = fileInput?.files?.[0]; - - if (!file) { - setStatus("Please select a PDF file.", true); - return; - } - - const submitBtn = uploadForm.querySelector("button[type='submit']"); - const originalText = submitBtn?.textContent || "Upload + Index"; - if (submitBtn) submitBtn.textContent = "Uploading..."; - - const formData = new FormData(); - formData.append("pdf", file); // backend expects 'pdf' - formData.append("user_id", currentUserId()); - - try { - const res = await fetch(`${API_BASE}/upload`, { - method: "POST", - body: formData, - }); - - const data = await safeJson(res); - if (!res.ok) { - setStatus(data.error || "Upload failed.", true); - return; - } - - setStatus(data.message || "PDF indexed successfully."); - } catch { - setStatus("Network error during upload.", true); - } finally { - if (submitBtn) submitBtn.textContent = originalText; - } - }); - - askForm?.addEventListener("submit", async (e) => { - e.preventDefault(); - - const questionInput = document.getElementById("question"); - const question = questionInput?.value?.trim(); - - if (!question) { - setStatus("Please enter a question.", true); - return; - } - - const submitBtn = askForm.querySelector("button[type='submit']"); - const originalText = submitBtn?.textContent || "Ask ScholarAI"; - if (submitBtn) submitBtn.textContent = "Thinking..."; - - if (answerBox) answerBox.textContent = "Thinking..."; - setStatus(""); - - try { - const res = await fetch(`${API_BASE}/ask`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - question, - user_id: currentUserId(), - }), - }); - - const data = await safeJson(res); - if (!res.ok) { - if (answerBox) answerBox.textContent = "No answer yet."; - setStatus(data.error || "Failed to fetch answer.", true); - return; - } - - if (answerBox) answerBox.textContent = data.answer || "No answer returned."; - setStatus("Answer ready."); - } catch { - if (answerBox) answerBox.textContent = "Network error."; - setStatus("Could not reach server.", true); - } finally { - if (submitBtn) submitBtn.textContent = originalText; - } - }); - - deleteBtn?.addEventListener("click", async () => { - const userId = currentUserId(); - const ok = window.confirm("Delete all indexed data for your current session?"); - if (!ok) return; - - setStatus("Deleting data..."); - - try { - const res = await fetch(`${API_BASE}/user/${encodeURIComponent(userId)}`, { - method: "DELETE", - }); - - const data = await safeJson(res); - if (!res.ok) { - setStatus(data.error || "Delete failed.", true); - return; - } - - if (answerBox) answerBox.textContent = "No answer yet."; - setStatus(data.message || "Data deleted."); - } catch { - setStatus("Network error during delete.", true); - } - }); -})(); \ No newline at end of file diff --git a/app/static/style.css b/app/static/style.css deleted file mode 100644 index 9ed8ccc..0000000 --- a/app/static/style.css +++ /dev/null @@ -1,513 +0,0 @@ -* { box-sizing: border-box; } - html { scroll-behavior: smooth; } - - :root { - --bg: #0b1220; - --bg-soft: #101a2f; - --panel: rgba(15, 23, 42, 0.78); - --panel-border: rgba(148, 163, 184, 0.18); - --text: #e5e7eb; - --muted: #9fb0c6; - --input-bg: #0f172a; - --input-border: #334155; - --primary: #3b82f6; - --primary-hover: #2563eb; - --danger: #dc2626; - --danger-hover: #b91c1c; - --accent: #14b8a6; - --section-max: 860px; - } - - body.app-theme { - margin: 0; - font-family: 'Sora', Arial, sans-serif; - color: var(--text); - background: - radial-gradient(circle at 0% 0%, rgba(20, 184, 166, 0.16), transparent 35%), - radial-gradient(circle at 100% 0%, rgba(249, 115, 22, 0.14), transparent 30%), - var(--bg); - min-height: 100vh; - } - - .hidden { display: none !important; } - .w-full { width: 100%; } - .text-sm { font-size: .88rem; } - .m-0 { margin: 0; } - .ml-auto { margin-left: auto; } - - /* โ”€โ”€ Navbar โ”€โ”€ */ - .corner-ui { - position: fixed; - top: 0; left: 0; right: 0; - z-index: 50; - display: flex; - align-items: center; - justify-content: space-between; - padding: 12px 24px; - background: rgba(11, 18, 32, 0.80); - backdrop-filter: blur(14px); - border-bottom: 1px solid var(--panel-border); - } - - .logo-pill { - display: inline-flex; - align-items: center; - gap: 10px; - text-decoration: none; - } - - .logo-img { - width: 36px; height: 36px; - object-fit: contain; - border-radius: 8px; - padding: 2px; - } - - .brand-text { - color: #f8fafc; - font-weight: 700; - font-size: 1rem; - letter-spacing: .2px; - } - - .menu-btn { - border: 1px solid var(--panel-border); - background: rgba(255,255,255,0.05); - color: #f8fafc; - border-radius: 8px; - padding: 7px 13px; - cursor: pointer; - font-size: 1rem; - display: none; - } - - .nav-links { - display: flex; - align-items: center; - gap: 4px; - } - - .nav-links a { - color: var(--muted); - text-decoration: none; - font-size: 0.88rem; - font-weight: 500; - padding: 6px 12px; - border-radius: 7px; - transition: color .2s, background .2s; - } - - .nav-links a:hover { color: #f8fafc; background: rgba(255,255,255,0.06); } - - .nav-links .nav-cta { - background: var(--primary); - color: #fff; - margin-left: 6px; - } - - .nav-links .nav-cta:hover { background: var(--primary-hover); } - - .quick-menu { - position: fixed; - right: 16px; - top: 62px; - z-index: 60; - width: 190px; - border-radius: 12px; - border: 1px solid var(--panel-border); - background: rgba(11, 18, 32, 0.96); - box-shadow: 0 16px 32px rgba(2, 6, 23, 0.5); - padding: 8px; - } - - .quick-menu a { - display: block; - text-decoration: none; - color: #dbe6f5; - padding: 10px 12px; - border-radius: 8px; - font-size: 0.9rem; - } - - .quick-menu a:hover { background: #18233b; } - - /* โ”€โ”€ Page sections wrapper โ”€โ”€ */ - .page-sections { - padding-top: 62px; /* navbar height */ - } - - /* โ”€โ”€ Hero โ”€โ”€ */ - .hero-section { - min-height: calc(100vh - 62px); - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - text-align: center; - padding: 60px 24px; - } - - .hero-chip { - display: inline-flex; - align-items: center; - gap: 6px; - padding: 6px 14px; - border-radius: 999px; - font-size: .78rem; - font-weight: 600; - letter-spacing: .4px; - text-transform: uppercase; - border: 1px solid rgba(20, 184, 166, 0.35); - background: rgba(20, 184, 166, 0.08); - color: var(--accent); - margin-bottom: 22px; - } - - .hero-section h1 { - margin: 0 0 18px; - font-size: clamp(2.4rem, 6vw, 3.8rem); - font-weight: 700; - color: #f8fafc; - line-height: 1.1; - letter-spacing: -1px; - } - - .hero-section h1 span { - background: linear-gradient(90deg, #3b82f6, #14b8a6); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - } - - .hero-desc { - max-width: 580px; - margin: 0 auto 32px; - color: var(--muted); - font-size: 1.05rem; - line-height: 1.7; - } - - .hero-actions { - display: flex; - gap: 12px; - flex-wrap: wrap; - justify-content: center; - } - - /* โ”€โ”€ Shared section wrapper โ”€โ”€ */ - .section-wrap { - width: min(var(--section-max), calc(100% - 40px)); - margin: 0 auto; - padding: 80px 0; - } - - .section-label { - display: inline-block; - font-size: .75rem; - font-weight: 700; - letter-spacing: .8px; - text-transform: uppercase; - color: var(--accent); - margin-bottom: 10px; - } - - .section-title { - font-size: clamp(1.5rem, 3vw, 2rem); - font-weight: 700; - color: #f8fafc; - margin: 0 0 32px; - letter-spacing: -.3px; - } - - /* โ”€โ”€ Workspace section โ”€โ”€ */ - #workspace { - background: linear-gradient(180deg, rgba(15,23,42,0.0) 0%, rgba(15,23,42,0.5) 100%); - border-top: 1px solid var(--panel-border); - border-bottom: 1px solid var(--panel-border); - } - - .workspace-meta { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - flex-wrap: wrap; - padding: 14px 18px; - border-radius: 10px; - background: rgba(255,255,255,0.03); - border: 1px solid var(--panel-border); - margin-bottom: 20px; - } - - .workspace-meta p { - margin: 0; - color: var(--muted); - font-size: .88rem; - } - - .grid-two { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 16px; - } - - /* Cards */ - .card { - background: var(--panel); - border: 1px solid var(--panel-border); - border-radius: 14px; - padding: 22px; - box-shadow: 0 8px 24px rgba(2, 6, 23, 0.3); - } - - .card-title { - margin: 0 0 16px; - font-size: .95rem; - font-weight: 700; - color: #f8fafc; - text-transform: uppercase; - letter-spacing: .5px; - display: flex; - align-items: center; - gap: 8px; - } - - .card-title::before { - content: ''; - display: block; - width: 3px; - height: 16px; - border-radius: 2px; - background: var(--primary); - flex-shrink: 0; - } - - .answer-panel { grid-column: 1 / -1; } - - /* Inputs */ - .card input[type="text"], - .card textarea, - .card input[type="file"] { - width: 100%; - padding: 10px 12px; - border: 1px solid var(--input-border); - border-radius: 8px; - font: inherit; - font-size: .92rem; - color: #e2e8f0; - background: var(--input-bg); - margin-bottom: 12px; - outline: none; - transition: border-color .2s; - } - - .card input:focus, - .card textarea:focus { - border-color: var(--primary); - } - - .card input[type="file"]::file-selector-button { - margin-right: 10px; - border: none; - border-radius: 6px; - padding: 7px 10px; - background: #1e293b; - color: #e2e8f0; - cursor: pointer; - font: inherit; - font-size: .85rem; - } - - /* Buttons */ - .action-btn { - display: inline-block; - padding: 10px 20px; - border: none; - border-radius: 8px; - background: var(--primary); - color: #fff; - font-weight: 600; - font-size: .9rem; - cursor: pointer; - text-decoration: none; - transition: background .2s, transform .1s; - font-family: inherit; - } - - .action-btn:hover { background: var(--primary-hover); transform: translateY(-1px); } - .action-btn:active { transform: translateY(0); } - - .action-btn.danger { background: var(--danger); } - .action-btn.danger:hover { background: var(--danger-hover); } - - .action-btn.ghost { - background: transparent; - border: 1px solid var(--panel-border); - color: #dbe6f5; - } - - .action-btn.ghost:hover { background: rgba(255,255,255,0.06); } - - /* Answer */ - #answerBox { - white-space: pre-wrap; - background: #020617; - padding: 16px; - border-radius: 10px; - border: 1px solid #1e293b; - min-height: 130px; - margin: 0; - color: #e2e8f0; - font-family: 'JetBrains Mono', monospace; - font-size: .88rem; - line-height: 1.6; - } - - .status { - margin-top: 10px; - color: #94a3b8; - font-size: .85rem; - min-height: 20px; - } - - /* โ”€โ”€ How to Use โ”€โ”€ */ - #how-to { - border-top: 1px solid var(--panel-border); - } - - .how-steps { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); - gap: 14px; - counter-reset: steps; - } - - .how-step { - counter-increment: steps; - padding: 20px; - border-radius: 12px; - border: 1px solid var(--panel-border); - background: rgba(255,255,255,0.025); - position: relative; - } - - .how-step::before { - content: counter(steps, decimal-leading-zero); - display: block; - font-size: 1.6rem; - font-weight: 700; - color: var(--primary); - font-family: 'JetBrains Mono', monospace; - margin-bottom: 10px; - opacity: .7; - } - - .how-step p { - margin: 0; - color: #cbd5e1; - font-size: .9rem; - line-height: 1.6; - } - - /* โ”€โ”€ Footer โ”€โ”€ */ - .site-footer { - border-top: 1px solid var(--panel-border); - background: rgba(11, 18, 32, 0.85); - backdrop-filter: blur(10px); - } - - .footer-inner { - width: min(var(--section-max), calc(100% - 40px)); - margin: 0 auto; - padding: 48px 0 32px; - display: grid; - grid-template-columns: 1fr auto; - gap: 40px; - align-items: start; - } - - .footer-brand .brand-text { - font-size: 1.05rem; - display: block; - margin-bottom: 8px; - } - - .footer-brand p { - margin: 0; - color: var(--muted); - font-size: .85rem; - line-height: 1.6; - max-width: 280px; - } - - .footer-nav { - display: flex; - flex-direction: column; - gap: 6px; - } - - .footer-nav-label { - font-size: .72rem; - font-weight: 700; - letter-spacing: .7px; - text-transform: uppercase; - color: var(--muted); - margin-bottom: 4px; - } - - .footer-link { - color: #94a3b8; - text-decoration: none; - font-size: .88rem; - transition: color .2s; - } - - .footer-link:hover { color: var(--accent); } - - .footer-bottom { - width: min(var(--section-max), calc(100% - 40px)); - margin: 0 auto; - padding: 16px 0; - border-top: 1px solid var(--panel-border); - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - flex-wrap: wrap; - } - - .footer-bottom p { - margin: 0; - color: #475569; - font-size: .8rem; - } - - .footer-bottom-links { - display: flex; - gap: 16px; - } - - .footer-bottom-links a { - color: #475569; - text-decoration: none; - font-size: .8rem; - transition: color .2s; - } - - .footer-bottom-links a:hover { color: var(--muted); } - - /* โ”€โ”€ Responsive โ”€โ”€ */ - @media (max-width: 700px) { - .menu-btn { display: block; } - .nav-links { display: none; } - - .grid-two { grid-template-columns: 1fr; } - - .footer-inner { - grid-template-columns: 1fr; - gap: 28px; - } - - .how-steps { grid-template-columns: 1fr; } - - .hero-section { padding: 48px 20px; } - } \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html deleted file mode 100644 index 370da17..0000000 --- a/app/templates/index.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - ScholarAI | Alpha One Labs - - - - - - - - - - - - - -
- - -
-

Open Source ยท Privacy-First

-

ScholarAI

-

- An open-source research assistant by Alpha One Labs. Upload PDF papers, build a searchable index, and get grounded answers using retrieval + LLM workflows โ€” built for students, researchers, and teams. -

- -
- - -
-
- -

Research Assistant

- -
- -

Your session is private โ€” auto-generated and stored in your browser only.

- -
- -
-
-

Upload PDF

-
- - -
-
- -
-

Ask a Question

-
- - -
-
- -
-

Answer

-
No answer yet.
-

-
-
-
-
- - -
-
- -

How to Use ScholarAI

-
-

Upload one or more PDF files using the Upload panel in the Workspace.

-

Wait for indexing to complete โ€” you'll see a status message when ready.

-

Type a clear, specific question based on your uploaded documents.

-

Review the grounded AI response in the Answer panel below.

-

Use "Delete My Data" anytime to clear your session and all indexed content.

-
-
-
- -
- - -
- - -
- - - - - - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..cc920a8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1504 @@ +{ + "name": "scholarai", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "scholarai", + "version": "1.0.0", + "devDependencies": { + "wrangler": "^4.0.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.15.0.tgz", + "integrity": "sha512-EGYmJaGZKWl+X8tXxcnx4v2bOZSjQeNI5dWFeXivgX9+YCT69AkzHHwlNbVpqtEUTbew8eQurpyOpeN8fg00nw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": "1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260312.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260312.1.tgz", + "integrity": "sha512-HUAtDWaqUduS6yasV6+NgsK7qBpP1qGU49ow/Wb117IHjYp+PZPUGReDYocpB4GOMRoQlvdd4L487iFxzdARpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260312.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260312.1.tgz", + "integrity": "sha512-DOn7TPTHSxJYfi4m4NYga/j32wOTqvJf/pY4Txz5SDKWIZHSTXFyGz2K4B+thoPWLop/KZxGoyTv7db0mk/qyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260312.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260312.1.tgz", + "integrity": "sha512-TdkIh3WzPXYHuvz7phAtFEEvAxvFd30tHrm4gsgpw0R0F5b8PtoM3hfL2uY7EcBBWVYUBtkY2ahDYFfufnXw/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260312.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260312.1.tgz", + "integrity": "sha512-kNauZhL569Iy94t844OMwa1zP6zKFiL3xiJ4tGLS+TFTEfZ3pZsRH6lWWOtkXkjTyCmBEOog0HSEKjIV4oAffw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260312.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260312.1.tgz", + "integrity": "sha512-5dBrlSK+nMsZy5bYQpj8t9iiQNvCRlkm9GGvswJa9vVU/1BNO4BhJMlqOLWT24EmFyApZ+kaBiPJMV8847NDTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.14.tgz", + "integrity": "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/miniflare": { + "version": "4.20260312.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260312.0.tgz", + "integrity": "sha512-pieP2rfXynPT6VRINYaiHe/tfMJ4c5OIhqRlIdLF6iZ9g5xgpEmvimvIgMpgAdDJuFlrLcwDUi8MfAo2R6dt/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.18.2", + "workerd": "1.20260312.1", + "ws": "8.18.0", + "youch": "4.1.0-beta.10" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/undici": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/workerd": { + "version": "1.20260312.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260312.1.tgz", + "integrity": "sha512-nNpPkw9jaqo79B+iBCOiksx+N62xC+ETIfyzofUEdY3cSOHJg6oNnVSHm7vHevzVblfV76c8Gr0cXHEapYMBEg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260312.1", + "@cloudflare/workerd-darwin-arm64": "1.20260312.1", + "@cloudflare/workerd-linux-64": "1.20260312.1", + "@cloudflare/workerd-linux-arm64": "1.20260312.1", + "@cloudflare/workerd-windows-64": "1.20260312.1" + } + }, + "node_modules/wrangler": { + "version": "4.73.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.73.0.tgz", + "integrity": "sha512-VJXsqKDFCp6OtFEHXITSOR5kh95JOknwPY8m7RyQuWJQguSybJy43m4vhoCSt42prutTef7eeuw7L4V4xiynGw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.4.2", + "@cloudflare/unenv-preset": "2.15.0", + "blake3-wasm": "2.1.5", + "esbuild": "0.27.3", + "miniflare": "4.20260312.0", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260312.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=20.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20260312.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/youch": { + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f26d6f0 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "scholarai", + "version": "1.0.0", + "description": "AI-powered research assistant using Cloudflare Workers AI", + "private": true, + "scripts": { + "dev": "wrangler dev", + "deploy": "wrangler deploy", + "start": "wrangler dev" + }, + "devDependencies": { + "wrangler": "^4.0.0" + } +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 9007450..0000000 --- a/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -flask -gunicorn -python-dotenv -langchain -langchain-community -langchain-text-splitters -langchain-google-genai -langchain-chroma -langchain-huggingface -chromadb -pypdf -sentence-transformers \ No newline at end of file diff --git a/src/worker.py b/src/worker.py new file mode 100644 index 0000000..30e2716 --- /dev/null +++ b/src/worker.py @@ -0,0 +1,274 @@ +""" +ScholarAI - Cloudflare Python Worker +Correct entrypoint: WorkerEntrypoint class with async fetch() method. +Uses JS interop (from js import ...) for Response, Headers, URL. +""" + +import json +from js import Response, Headers, URL +from pyodide.ffi import to_js +from workers import WorkerEntrypoint + + +# --------------------------------------------------------------------------- +# Config +# --------------------------------------------------------------------------- +AI_MODEL = "@cf/meta/llama-3.1-8b-instruct" +MAX_TOKENS = 1024 + + +# --------------------------------------------------------------------------- +# Response helpers +# --------------------------------------------------------------------------- + +def _headers(content_type: str = "application/json") -> Headers: + h = Headers.new() + h.set("Content-Type", content_type) + h.set("Access-Control-Allow-Origin", "*") + h.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") + h.set("Access-Control-Allow-Headers", "Content-Type") + return h + + +def json_resp(data: dict, status: int = 200) -> Response: + return Response.new( + json.dumps(data), + to_js({"status": status, "headers": {"Content-Type": "application/json", + "Access-Control-Allow-Origin": "*"}}), + ) + + +def error_resp(message: str, status: int = 400) -> Response: + return json_resp({"ok": False, "error": message}, status) + + +def html_resp(html: str) -> Response: + return Response.new( + html, + to_js({"status": 200, "headers": {"Content-Type": "text/html; charset=utf-8"}}), + ) + + +def cors_resp() -> Response: + return Response.new( + "", + to_js({ + "status": 204, + "headers": { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, POST, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", + }, + }), + ) + + +# --------------------------------------------------------------------------- +# AI helper +# --------------------------------------------------------------------------- + +async def run_ai(env, system_prompt: str, user_prompt: str) -> str: + payload = to_js({ + "messages": [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt}, + ], + "max_tokens": MAX_TOKENS, + }) + result = await env.AI.run(AI_MODEL, payload) + text = getattr(result, "response", None) + if text is None: + text = str(result) + return text.strip() + + +# --------------------------------------------------------------------------- +# Body parser +# --------------------------------------------------------------------------- + +async def parse_body(request) -> dict: + try: + text = await request.text() + return json.loads(text) if text else {} + except Exception: + return {} + + +# --------------------------------------------------------------------------- +# HTML โ€” served via ASSETS binding +# --------------------------------------------------------------------------- + +_HTML_CACHE: str | None = None + + +async def get_html(env) -> str: + global _HTML_CACHE + if _HTML_CACHE: + return _HTML_CACHE + try: + resp = await env.ASSETS.fetch("http://assets/index.html") + _HTML_CACHE = await resp.text() + return _HTML_CACHE + except Exception as e: + return ( + "" + "

ScholarAI

" + f"

Frontend load error: {e}

" + "" + ) + + +# --------------------------------------------------------------------------- +# Route handlers +# --------------------------------------------------------------------------- + +async def handle_health(request, env) -> Response: + return json_resp({"ok": True, "service": "scholarai", "model": AI_MODEL}) + + +async def handle_ask(request, env) -> Response: + body = await parse_body(request) + question = str(body.get("question") or "").strip() + context = str(body.get("context") or "").strip() + + if not question: + return error_resp("'question' is required.") + + system_prompt = ( + "You are ScholarAI, an expert academic research assistant. " + "Answer research questions clearly and accurately. " + "If paper context is provided, base your answer on it. " + "If unsure, say so rather than guessing." + ) + ctx_block = f"\n\nContext from uploaded paper:\n{context[:10000]}" if context else "" + user_prompt = f"Question: {question}{ctx_block}" + + try: + answer = await run_ai(env, system_prompt, user_prompt) + return json_resp({"ok": True, "answer": answer}) + except Exception as e: + return error_resp(f"AI error: {e}", 500) + + +async def handle_summarize(request, env) -> Response: + body = await parse_body(request) + title = str(body.get("title") or "").strip() + abstract = str(body.get("abstract") or "").strip() + content = str(body.get("content") or "").strip() + + if not (title or abstract or content): + return error_resp("At least one of 'title', 'abstract', or 'content' is required.") + + parts = [] + if title: parts.append(f"Title: {title}") + if abstract: parts.append(f"Abstract: {abstract}") + if content: parts.append(f"Content:\n{content[:10000]}") + + system_prompt = ( + "You are ScholarAI, an expert at summarising research papers. " + "Produce a structured summary: main contribution, problem, " + "methodology, key findings, and significance." + ) + user_prompt = "Summarise this paper:\n\n" + "\n\n".join(parts) + + try: + summary = await run_ai(env, system_prompt, user_prompt) + return json_resp({"ok": True, "title": title, "summary": summary}) + except Exception as e: + return error_resp(f"AI error: {e}", 500) + + +async def handle_discover(request, env) -> Response: + body = await parse_body(request) + query = str(body.get("query") or "").strip() + fields = body.get("fields") or [] + limit = int(body.get("limit") or 10) + + if not query: + return error_resp("'query' is required.") + + field_ctx = f" in the fields of {', '.join(fields)}" if fields else "" + system_prompt = ( + "You are ScholarAI, an expert academic research assistant. " + "Suggest relevant papers, key concepts, and research directions." + ) + user_prompt = ( + f"Suggest up to {limit} relevant academic papers{field_ctx} for:\n\n" + f"Query: {query}\n\n" + "For each paper: title, likely authors/year, one-line relevance. " + "Then list 3-5 key concepts and 2-3 related queries." + ) + + try: + results = await run_ai(env, system_prompt, user_prompt) + return json_resp({"ok": True, "query": query, "results": results}) + except Exception as e: + return error_resp(f"AI error: {e}", 500) + + +async def handle_review(request, env) -> Response: + body = await parse_body(request) + topic = str(body.get("topic") or "").strip() + style = str(body.get("style") or "comprehensive").strip() + audience = str(body.get("audience") or "researchers").strip() + context = str(body.get("context") or "").strip() + + if not topic: + return error_resp("'topic' is required.") + + ctx_block = f"\n\nPaper content for reference:\n{context[:10000]}" if context else "" + system_prompt = ( + "You are ScholarAI, an expert at writing academic literature reviews. " + "Generate well-structured, rigorous literature reviews." + ) + user_prompt = ( + f"Write a {style} literature review on '{topic}' for {audience}.{ctx_block}\n\n" + "Structure: Introduction, Background, State of the Art, " + "Key Methodologies, Major Findings, Open Challenges, Future Directions." + ) + + try: + review = await run_ai(env, system_prompt, user_prompt) + return json_resp({"ok": True, "topic": topic, "style": style, "review": review}) + except Exception as e: + return error_resp(f"AI error: {e}", 500) + + +# --------------------------------------------------------------------------- +# Router table +# --------------------------------------------------------------------------- + +ROUTES = { + "GET /api/health": handle_health, + "POST /api/ask": handle_ask, + "POST /api/summarize": handle_summarize, + "POST /api/discover": handle_discover, + "POST /api/review": handle_review, +} + + +# --------------------------------------------------------------------------- +# Entrypoint โ€” MUST be a WorkerEntrypoint subclass with async fetch() +# Cloudflare Python Workers require this exact pattern. +# --------------------------------------------------------------------------- + +class Default(WorkerEntrypoint): + + async def fetch(self, request) -> Response: + method = request.method.upper() + path = URL.new(str(request.url)).pathname + + # CORS preflight + if method == "OPTIONS": + return cors_resp() + + # Serve HTML for root path + if method == "GET" and path in ("/", "/index.html"): + return html_resp(await get_html(self.env)) + + # API routes + handler = ROUTES.get(f"{method} {path}") + if handler is None: + return error_resp(f"Not found: {method} {path}", 404) + + return await handler(request, self.env) \ No newline at end of file diff --git a/app/static/images/logo.png b/static/images/logo.png similarity index 100% rename from app/static/images/logo.png rename to static/images/logo.png diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..a00fddb --- /dev/null +++ b/static/index.html @@ -0,0 +1,564 @@ + + + + + + ScholarAI | Alpha One Labs + + + + + + + + + + + + + +
+ + +
+

Open Source ยท Privacy-First ยท Cloudflare Workers AI

+

ScholarAI

+

+ An open-source research assistant by Alpha One Labs. Ask research questions, summarise papers, discover literature โ€” powered by Cloudflare Workers AI. +

+ +
+ + +
+
+ +

Research Assistant

+ + +
+
+
+
๐Ÿ“„
+
+
Upload your research paper
+
+ PDF is read locally in your browser โ€” nothing is uploaded to any server +
+
+
+
+ + + +
+
+ + + + + +
+
+ + +
+ + + + +
+ + +
+

Ask a Research Question

+ + + + + +
+
+
Answer
+
No answer yet.
+
+
+ + +
+

Summarise a Paper

+ + + + + + + +
+
+
Summary
+
No summary yet.
+
+
+ + +
+

Discover Papers

+ + + + + +
+
+
Results
+
No results yet.
+
+
+ + +
+

Generate a Literature Review

+ + +
+
+ + +
+
+ + +
+
+ +
+
+
Literature Review
+
No review yet.
+
+
+ +
+
+ + +
+
+ +

How to Use ScholarAI

+
+

Upload your PDF research paper using the panel above the tabs โ€” it stays in your browser, nothing is sent to a server.

+

The text is extracted automatically. It will be injected as context into Ask, Summarise, and Review.

+

Pick a tool tab: Ask a question, Summarise, Discover new papers, or Generate a Review.

+

Hit the action button โ€” the AI responds in seconds using your paper as context.

+

All processing is stateless โ€” no data is stored between sessions.

+
+
+
+ +
+ + +
+ + +
+ + + + + + \ No newline at end of file diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..335c5ef --- /dev/null +++ b/static/style.css @@ -0,0 +1,566 @@ + /* โ”€โ”€ Reset & Root โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + *, *::before, *::after { box-sizing: border-box; } + html { scroll-behavior: smooth; } + + :root { + --bg: #0b1220; + --bg-soft: #101a2f; + --panel: rgba(15, 23, 42, 0.78); + --panel-border: rgba(148, 163, 184, 0.16); + --text: #e5e7eb; + --muted: #9fb0c6; + --input-bg: #0f172a; + --input-border: #334155; + --primary: #3b82f6; + --primary-h: #2563eb; + --accent: #14b8a6; + --danger: #dc2626; + --danger-h: #b91c1c; + --success: #22c55e; + --section-max: 860px; + --nav-h: 62px; + } + + body { + margin: 0; + font-family: 'Sora', sans-serif; + color: var(--text); + background: + radial-gradient(circle at 0% 0%, rgba(20,184,166,.16), transparent 35%), + radial-gradient(circle at 100% 0%, rgba(249,115,22,.14), transparent 30%), + var(--bg); + min-height: 100vh; + } + + /* โ”€โ”€ Utilities โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .hidden { display: none !important; } + .w-full { width: 100%; } + .m-0 { margin: 0; } + + /* โ”€โ”€ Navbar โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .navbar { + position: fixed; + inset: 0 0 auto 0; + z-index: 50; + height: var(--nav-h); + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 28px; + background: rgba(11,18,32,.88); + backdrop-filter: blur(14px); + border-bottom: 1px solid var(--panel-border); + } + + .logo-pill { + display: inline-flex; + align-items: center; + gap: 10px; + text-decoration: none; + } + + .logo-img { + width: 34px; height: 34px; + border-radius: 8px; + object-fit: contain; + } + + .brand-text { + color: #f8fafc; + font-weight: 700; + font-size: .95rem; + } + + .nav-links { + display: flex; + align-items: center; + gap: 2px; + } + + .nav-links a { + color: var(--muted); + text-decoration: none; + font-size: .85rem; + font-weight: 500; + padding: 6px 11px; + border-radius: 7px; + transition: color .15s, background .15s; + } + + .nav-links a:hover { color: #f8fafc; background: rgba(255,255,255,.06); } + + .nav-cta { + background: var(--primary) !important; + color: #fff !important; + margin-left: 6px; + } + + .nav-cta:hover { background: var(--primary-h) !important; } + + .menu-btn { + display: none; + border: 1px solid var(--panel-border); + background: rgba(255,255,255,.05); + color: #f8fafc; + border-radius: 8px; + padding: 7px 13px; + cursor: pointer; + font-size: 1rem; + } + + .mobile-menu { + position: fixed; + right: 16px; + top: calc(var(--nav-h) + 8px); + z-index: 60; + width: 200px; + border-radius: 12px; + border: 1px solid var(--panel-border); + background: rgba(11,18,32,.97); + box-shadow: 0 16px 32px rgba(2,6,23,.5); + padding: 8px; + } + + .mobile-menu a { + display: block; + color: #dbe6f5; + text-decoration: none; + padding: 10px 12px; + border-radius: 8px; + font-size: .9rem; + } + + .mobile-menu a:hover { background: #18233b; } + + /* โ”€โ”€ Page wrapper โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .page { padding-top: var(--nav-h); } + + /* โ”€โ”€ Section shared โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .section-wrap { + width: min(var(--section-max), calc(100% - 40px)); + margin: 0 auto; + padding: 80px 0; + } + + .section-label { + display: inline-block; + font-size: .72rem; + font-weight: 700; + letter-spacing: .8px; + text-transform: uppercase; + color: var(--accent); + margin-bottom: 8px; + } + + .section-title { + font-size: clamp(1.4rem, 3vw, 1.9rem); + font-weight: 700; + color: #f8fafc; + margin: 0 0 28px; + letter-spacing: -.3px; + } + + /* โ”€โ”€ Hero โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .hero { + min-height: calc(100vh - var(--nav-h)); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + padding: 60px 24px; + } + + .hero-chip { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 5px 14px; + border-radius: 999px; + font-size: .75rem; + font-weight: 600; + letter-spacing: .5px; + text-transform: uppercase; + border: 1px solid rgba(20,184,166,.35); + background: rgba(20,184,166,.07); + color: var(--accent); + margin-bottom: 20px; + } + + .hero h1 { + margin: 0 0 18px; + font-size: clamp(2.6rem, 7vw, 4.2rem); + font-weight: 700; + color: #f8fafc; + line-height: 1.08; + letter-spacing: -1.5px; + } + + .hero h1 span { + background: linear-gradient(90deg, #3b82f6 30%, #14b8a6); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + + .hero-desc { + max-width: 560px; + margin: 0 auto 36px; + color: var(--muted); + font-size: 1.05rem; + line-height: 1.75; + } + + .hero-actions { + display: flex; + gap: 12px; + flex-wrap: wrap; + justify-content: center; + } + + /* โ”€โ”€ Buttons โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .btn { + display: inline-block; + padding: 10px 22px; + border: none; + border-radius: 8px; + background: var(--primary); + color: #fff; + font: 600 .9rem/1 'Sora', sans-serif; + cursor: pointer; + text-decoration: none; + transition: background .15s, transform .1s, opacity .15s; + } + + .btn:hover { background: var(--primary-h); transform: translateY(-1px); } + .btn:active { transform: none; } + .btn:disabled { opacity: .55; cursor: not-allowed; transform: none; } + + .btn-ghost { + background: transparent; + border: 1px solid var(--panel-border); + color: #dbe6f5; + } + + .btn-ghost:hover { background: rgba(255,255,255,.06); } + + .btn-danger { background: var(--danger); } + .btn-danger:hover { background: var(--danger-h); } + + /* โ”€โ”€ Cards โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .card { + background: var(--panel); + border: 1px solid var(--panel-border); + border-radius: 14px; + padding: 22px; + box-shadow: 0 8px 24px rgba(2,6,23,.28); + } + + .card-title { + margin: 0 0 16px; + font-size: .88rem; + font-weight: 700; + color: #f8fafc; + text-transform: uppercase; + letter-spacing: .5px; + display: flex; + align-items: center; + gap: 8px; + } + + .card-title::before { + content: ''; + display: block; + width: 3px; height: 15px; + border-radius: 2px; + background: var(--primary); + flex-shrink: 0; + } + + /* โ”€โ”€ Inputs โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .input, textarea, input[type="text"] { + width: 100%; + padding: 10px 12px; + border: 1px solid var(--input-border); + border-radius: 8px; + font: .9rem/1.5 'Sora', sans-serif; + color: #e2e8f0; + background: var(--input-bg); + margin-bottom: 12px; + outline: none; + transition: border-color .15s; + display: block; + resize: vertical; + } + + .input:focus, textarea:focus { border-color: var(--primary); } + + /* โ”€โ”€ Tab system โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .tab-bar { + display: flex; + gap: 4px; + margin-bottom: 20px; + border-bottom: 1px solid var(--panel-border); + padding-bottom: 0; + } + + .tab-btn { + padding: 8px 16px; + border: none; + background: transparent; + color: var(--muted); + font: 600 .82rem/1 'Sora', sans-serif; + cursor: pointer; + border-bottom: 2px solid transparent; + margin-bottom: -1px; + border-radius: 6px 6px 0 0; + transition: color .15s, border-color .15s; + letter-spacing: .3px; + text-transform: uppercase; + } + + .tab-btn:hover { color: #f8fafc; } + .tab-btn.active { color: var(--primary); border-bottom-color: var(--primary); } + + .tab-panel { display: none; } + .tab-panel.active { display: block; } + + /* โ”€โ”€ Ask tab โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + #answerBox { + white-space: pre-wrap; + background: #020617; + padding: 16px; + border-radius: 10px; + border: 1px solid #1e293b; + min-height: 130px; + color: #e2e8f0; + font: .88rem/1.65 'JetBrains Mono', monospace; + margin: 0; + } + + /* โ”€โ”€ Status bar โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .status-bar { + margin-top: 10px; + font-size: .83rem; + min-height: 20px; + color: #64748b; + } + + .status-bar.ok { color: var(--success); } + .status-bar.err { color: #f87171; } + .status-bar.inf { color: #60a5fa; } + + /* โ”€โ”€ Workspace meta row โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .meta-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + flex-wrap: wrap; + padding: 12px 16px; + border-radius: 10px; + background: rgba(255,255,255,.025); + border: 1px solid var(--panel-border); + margin-bottom: 20px; + } + + .meta-row p { margin: 0; color: var(--muted); font-size: .84rem; } + + /* โ”€โ”€ How-to steps โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + #how-to { border-top: 1px solid var(--panel-border); } + + .how-steps { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); + gap: 14px; + counter-reset: steps; + } + + .how-step { + counter-increment: steps; + padding: 20px; + border-radius: 12px; + border: 1px solid var(--panel-border); + background: rgba(255,255,255,.02); + } + + .how-step::before { + content: counter(steps, decimal-leading-zero); + display: block; + font: 700 1.5rem/1 'JetBrains Mono', monospace; + color: var(--primary); + opacity: .65; + margin-bottom: 10px; + } + + .how-step p { margin: 0; color: #cbd5e1; font-size: .88rem; line-height: 1.6; } + + /* โ”€โ”€ Footer โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .site-footer { + border-top: 1px solid var(--panel-border); + background: rgba(11,18,32,.9); + } + + .footer-inner { + width: min(var(--section-max), calc(100% - 40px)); + margin: 0 auto; + padding: 48px 0 32px; + display: grid; + grid-template-columns: 1fr auto; + gap: 40px; + align-items: start; + } + + .footer-brand .brand-text { display: block; margin-bottom: 8px; font-size: 1rem; } + .footer-brand p { margin: 0; color: var(--muted); font-size: .84rem; line-height: 1.6; max-width: 280px; } + + .footer-nav-label { + font-size: .7rem; + font-weight: 700; + letter-spacing: .7px; + text-transform: uppercase; + color: var(--muted); + margin: 0 0 8px; + } + + .footer-nav { display: flex; flex-direction: column; gap: 6px; } + + .footer-link { color: #94a3b8; text-decoration: none; font-size: .86rem; transition: color .15s; } + .footer-link:hover { color: var(--accent); } + + .footer-bottom { + width: min(var(--section-max), calc(100% - 40px)); + margin: 0 auto; + padding: 16px 0; + border-top: 1px solid var(--panel-border); + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; + } + + .footer-bottom p { margin: 0; color: #475569; font-size: .78rem; } + + .footer-bottom-links { display: flex; gap: 16px; } + .footer-bottom-links a { color: #475569; text-decoration: none; font-size: .78rem; transition: color .15s; } + .footer-bottom-links a:hover { color: var(--muted); } + + /* โ”€โ”€ PDF Upload Panel โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + .pdf-panel { + margin-bottom: 20px; + border-radius: 14px; + border: 1.5px dashed var(--panel-border); + background: rgba(15,23,42,.5); + padding: 20px 22px; + transition: border-color .2s, background .2s; + } + + .pdf-panel.has-pdf { + border-style: solid; + border-color: var(--accent); + background: rgba(20,184,166,.06); + } + + .pdf-panel.dragging { + border-color: var(--primary); + background: rgba(59,130,246,.08); + } + + .pdf-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; + } + + .pdf-label { + display: flex; + align-items: center; + gap: 10px; + font-size: .88rem; + font-weight: 600; + color: #f8fafc; + } + + .pdf-icon { + width: 32px; height: 32px; + border-radius: 8px; + background: rgba(59,130,246,.15); + display: flex; + align-items: center; + justify-content: center; + font-size: 1rem; + flex-shrink: 0; + } + + .pdf-icon.loaded { background: rgba(20,184,166,.18); } + + .pdf-actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } + + .btn-sm { + padding: 7px 14px; + font-size: .8rem; + border-radius: 7px; + } + + .pdf-meta { + margin-top: 12px; + padding: 10px 14px; + border-radius: 8px; + background: rgba(255,255,255,.04); + border: 1px solid var(--panel-border); + font-size: .82rem; + color: var(--muted); + display: flex; + gap: 16px; + flex-wrap: wrap; + } + + .pdf-meta span { display: flex; align-items: center; gap: 5px; } + + .pdf-badge { + display: inline-block; + padding: 2px 8px; + border-radius: 999px; + font-size: .72rem; + font-weight: 700; + letter-spacing: .3px; + background: rgba(20,184,166,.15); + color: var(--accent); + border: 1px solid rgba(20,184,166,.3); + } + + .pdf-inject-note { + margin-top: 10px; + font-size: .78rem; + color: var(--accent); + opacity: .8; + } + + /* file input hidden, label acts as button */ + #pdfFileInput { display: none; } + + /* โ”€โ”€ Spinner โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + @keyframes spin { to { transform: rotate(360deg); } } + + .spinner { + display: inline-block; + width: 14px; height: 14px; + border: 2px solid rgba(255,255,255,.2); + border-top-color: #fff; + border-radius: 50%; + animation: spin .6s linear infinite; + vertical-align: middle; + margin-right: 6px; + } + + /* โ”€โ”€ Responsive โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ + @media (max-width: 680px) { + .menu-btn { display: block; } + .nav-links { display: none; } + .footer-inner { grid-template-columns: 1fr; gap: 24px; } + .how-steps { grid-template-columns: 1fr; } + .hero { padding: 48px 20px; } + .tab-btn { font-size: .75rem; padding: 7px 11px; } + } \ No newline at end of file diff --git a/wrangler.jsonc b/wrangler.jsonc new file mode 100644 index 0000000..090b2ec --- /dev/null +++ b/wrangler.jsonc @@ -0,0 +1,20 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "scholarai", + "main": "src/worker.py", + "compatibility_date": "2025-11-02", + "compatibility_flags": [ + "python_workers", + "python_dedicated_snapshot" + ], + "ai": { + "binding": "AI" + }, + "assets": { + "binding": "ASSETS", + "directory": "./static" + }, + "observability": { + "enabled": true + } +} From c496d3289c75530dd6930bee68f89bd5562a059b Mon Sep 17 00:00:00 2001 From: Ghanshyam Singh Date: Sun, 15 Mar 2026 10:59:08 +0530 Subject: [PATCH 4/4] ScholarAI worker implementation using Cloudflare Workers AI --- .../middleware-insertion-facade.js | 10 - .../bundle-lfsPwi/middleware-loader.entry.ts | 134 - .wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js | 3567 ----------------- .../tmp/dev-ePVlVV/ProxyServerWorker.js.map | 8 - 4 files changed, 3719 deletions(-) delete mode 100644 .wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js delete mode 100644 .wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts delete mode 100644 .wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js delete mode 100644 .wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js.map diff --git a/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js b/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js deleted file mode 100644 index 6237209..0000000 --- a/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js +++ /dev/null @@ -1,10 +0,0 @@ - import worker, * as OTHER_EXPORTS from "/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/wrangler-dist/ProxyServerWorker.js"; - import * as __MIDDLEWARE_0__ from "/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts"; - - export * from "/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/wrangler-dist/ProxyServerWorker.js"; - const MIDDLEWARE_TEST_INJECT = "__INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__"; - export const __INTERNAL_WRANGLER_MIDDLEWARE__ = [ - - __MIDDLEWARE_0__.default - ] - export default worker; \ No newline at end of file diff --git a/.wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts b/.wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts deleted file mode 100644 index 5f0a4bf..0000000 --- a/.wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts +++ /dev/null @@ -1,134 +0,0 @@ -// This loads all middlewares exposed on the middleware object and then starts -// the invocation chain. The big idea is that we can add these to the middleware -// export dynamically through wrangler, or we can potentially let users directly -// add them as a sort of "plugin" system. - -import ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from "/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js"; -import { __facade_invoke__, __facade_register__, Dispatcher } from "/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/templates/middleware/common.ts"; -import type { WorkerEntrypointConstructor } from "/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js"; - -// Preserve all the exports from the worker -export * from "/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js"; - -class __Facade_ScheduledController__ implements ScheduledController { - readonly #noRetry: ScheduledController["noRetry"]; - - constructor( - readonly scheduledTime: number, - readonly cron: string, - noRetry: ScheduledController["noRetry"] - ) { - this.#noRetry = noRetry; - } - - noRetry() { - if (!(this instanceof __Facade_ScheduledController__)) { - throw new TypeError("Illegal invocation"); - } - // Need to call native method immediately in case uncaught error thrown - this.#noRetry(); - } -} - -function wrapExportedHandler(worker: ExportedHandler): ExportedHandler { - // If we don't have any middleware defined, just return the handler as is - if ( - __INTERNAL_WRANGLER_MIDDLEWARE__ === undefined || - __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0 - ) { - return worker; - } - // Otherwise, register all middleware once - for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { - __facade_register__(middleware); - } - - const fetchDispatcher: ExportedHandlerFetchHandler = function ( - request, - env, - ctx - ) { - if (worker.fetch === undefined) { - throw new Error("Handler does not export a fetch() function."); - } - return worker.fetch(request, env, ctx); - }; - - return { - ...worker, - fetch(request, env, ctx) { - const dispatcher: Dispatcher = function (type, init) { - if (type === "scheduled" && worker.scheduled !== undefined) { - const controller = new __Facade_ScheduledController__( - Date.now(), - init.cron ?? "", - () => {} - ); - return worker.scheduled(controller, env, ctx); - } - }; - return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher); - }, - }; -} - -function wrapWorkerEntrypoint( - klass: WorkerEntrypointConstructor -): WorkerEntrypointConstructor { - // If we don't have any middleware defined, just return the handler as is - if ( - __INTERNAL_WRANGLER_MIDDLEWARE__ === undefined || - __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0 - ) { - return klass; - } - // Otherwise, register all middleware once - for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { - __facade_register__(middleware); - } - - // `extend`ing `klass` here so other RPC methods remain callable - return class extends klass { - #fetchDispatcher: ExportedHandlerFetchHandler> = ( - request, - env, - ctx - ) => { - this.env = env; - this.ctx = ctx; - if (super.fetch === undefined) { - throw new Error("Entrypoint class does not define a fetch() function."); - } - return super.fetch(request); - }; - - #dispatcher: Dispatcher = (type, init) => { - if (type === "scheduled" && super.scheduled !== undefined) { - const controller = new __Facade_ScheduledController__( - Date.now(), - init.cron ?? "", - () => {} - ); - return super.scheduled(controller); - } - }; - - fetch(request: Request) { - return __facade_invoke__( - request, - this.env, - this.ctx, - this.#dispatcher, - this.#fetchDispatcher - ); - } - }; -} - -let WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined; -if (typeof ENTRY === "object") { - WRAPPED_ENTRY = wrapExportedHandler(ENTRY); -} else if (typeof ENTRY === "function") { - WRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY); -} -export default WRAPPED_ENTRY; diff --git a/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js b/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js deleted file mode 100644 index fc37982..0000000 --- a/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js +++ /dev/null @@ -1,3567 +0,0 @@ -var __defProp = Object.defineProperty; -var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); - -// node_modules/wrangler/wrangler-dist/ProxyServerWorker.js -import * as cfw from "cloudflare:workers"; -import { EmailMessage } from "cloudflare:email"; -var WORKERS_MODULE_SYMBOL = /* @__PURE__ */ Symbol("workers-module"); -globalThis[WORKERS_MODULE_SYMBOL] = cfw; -if (!Symbol.dispose) { - Symbol.dispose = /* @__PURE__ */ Symbol.for("dispose"); -} -if (!Symbol.asyncDispose) { - Symbol.asyncDispose = /* @__PURE__ */ Symbol.for("asyncDispose"); -} -if (!Promise.withResolvers) { - Promise.withResolvers = function() { - let resolve; - let reject; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - return { promise, resolve, reject }; - }; -} -var workersModule = globalThis[WORKERS_MODULE_SYMBOL]; -var RpcTarget = workersModule ? workersModule.RpcTarget : class { -}; -var AsyncFunction = (async function() { -}).constructor; -function typeForRpc(value) { - switch (typeof value) { - case "boolean": - case "number": - case "string": - return "primitive"; - case "undefined": - return "undefined"; - case "object": - case "function": - break; - case "bigint": - return "bigint"; - default: - return "unsupported"; - } - if (value === null) { - return "primitive"; - } - let prototype = Object.getPrototypeOf(value); - switch (prototype) { - case Object.prototype: - return "object"; - case Function.prototype: - case AsyncFunction.prototype: - return "function"; - case Array.prototype: - return "array"; - case Date.prototype: - return "date"; - case Uint8Array.prototype: - return "bytes"; - case WritableStream.prototype: - return "writable"; - case ReadableStream.prototype: - return "readable"; - case Headers.prototype: - return "headers"; - case Request.prototype: - return "request"; - case Response.prototype: - return "response"; - // TODO: All other structured clone types. - case RpcStub.prototype: - return "stub"; - case RpcPromise.prototype: - return "rpc-promise"; - // TODO: Promise or thenable - default: - if (workersModule) { - if (prototype == workersModule.RpcStub.prototype || value instanceof workersModule.ServiceStub) { - return "rpc-target"; - } else if (prototype == workersModule.RpcPromise.prototype || prototype == workersModule.RpcProperty.prototype) { - return "rpc-thenable"; - } - } - if (value instanceof RpcTarget) { - return "rpc-target"; - } - if (value instanceof Error) { - return "error"; - } - return "unsupported"; - } -} -__name(typeForRpc, "typeForRpc"); -function mapNotLoaded() { - throw new Error("RPC map() implementation was not loaded."); -} -__name(mapNotLoaded, "mapNotLoaded"); -var mapImpl = { applyMap: mapNotLoaded, sendMap: mapNotLoaded }; -function streamNotLoaded() { - throw new Error("Stream implementation was not loaded."); -} -__name(streamNotLoaded, "streamNotLoaded"); -var streamImpl = { - createWritableStreamHook: streamNotLoaded, - createWritableStreamFromHook: streamNotLoaded, - createReadableStreamHook: streamNotLoaded -}; -var StubHook = class { - static { - __name(this, "StubHook"); - } - // Like call(), but designed for streaming calls (e.g. WritableStream writes). Returns: - // - promise: A Promise for the completion of the call. - // - size: If the call was remote, the byte size of the serialized message. For local calls, - // undefined is returned, indicating the caller should await the promise to serialize writes - // (no overlapping). - stream(path, args) { - let hook = this.call(path, args); - let pulled = hook.pull(); - let promise; - if (pulled instanceof Promise) { - promise = pulled.then((p) => { - p.dispose(); - }); - } else { - pulled.dispose(); - promise = Promise.resolve(); - } - return { promise }; - } -}; -var ErrorStubHook = class extends StubHook { - static { - __name(this, "ErrorStubHook"); - } - constructor(error) { - super(); - this.error = error; - } - call(path, args) { - return this; - } - map(path, captures, instructions) { - return this; - } - get(path) { - return this; - } - dup() { - return this; - } - pull() { - return Promise.reject(this.error); - } - ignoreUnhandledRejections() { - } - dispose() { - } - onBroken(callback) { - try { - callback(this.error); - } catch (err) { - Promise.resolve(err); - } - } -}; -var DISPOSED_HOOK = new ErrorStubHook( - new Error("Attempted to use RPC stub after it has been disposed.") -); -var doCall = /* @__PURE__ */ __name((hook, path, params) => { - return hook.call(path, params); -}, "doCall"); -function withCallInterceptor(interceptor, callback) { - let oldValue = doCall; - doCall = interceptor; - try { - return callback(); - } finally { - doCall = oldValue; - } -} -__name(withCallInterceptor, "withCallInterceptor"); -var RAW_STUB = /* @__PURE__ */ Symbol("realStub"); -var PROXY_HANDLERS = { - apply(target, thisArg, argumentsList) { - let stub = target.raw; - return new RpcPromise(doCall( - stub.hook, - stub.pathIfPromise || [], - RpcPayload.fromAppParams(argumentsList) - ), []); - }, - get(target, prop, receiver) { - let stub = target.raw; - if (prop === RAW_STUB) { - return stub; - } else if (prop in RpcPromise.prototype) { - return stub[prop]; - } else if (typeof prop === "string") { - return new RpcPromise( - stub.hook, - stub.pathIfPromise ? [...stub.pathIfPromise, prop] : [prop] - ); - } else if (prop === Symbol.dispose && (!stub.pathIfPromise || stub.pathIfPromise.length == 0)) { - return () => { - stub.hook.dispose(); - stub.hook = DISPOSED_HOOK; - }; - } else { - return void 0; - } - }, - has(target, prop) { - let stub = target.raw; - if (prop === RAW_STUB) { - return true; - } else if (prop in RpcPromise.prototype) { - return prop in stub; - } else if (typeof prop === "string") { - return true; - } else if (prop === Symbol.dispose && (!stub.pathIfPromise || stub.pathIfPromise.length == 0)) { - return true; - } else { - return false; - } - }, - construct(target, args) { - throw new Error("An RPC stub cannot be used as a constructor."); - }, - defineProperty(target, property, attributes) { - throw new Error("Can't define properties on RPC stubs."); - }, - deleteProperty(target, p) { - throw new Error("Can't delete properties on RPC stubs."); - }, - getOwnPropertyDescriptor(target, p) { - return void 0; - }, - getPrototypeOf(target) { - return Object.getPrototypeOf(target.raw); - }, - isExtensible(target) { - return false; - }, - ownKeys(target) { - return []; - }, - preventExtensions(target) { - return true; - }, - set(target, p, newValue, receiver) { - throw new Error("Can't assign properties on RPC stubs."); - }, - setPrototypeOf(target, v) { - throw new Error("Can't override prototype of RPC stubs."); - } -}; -var RpcStub = class _RpcStub extends RpcTarget { - static { - __name(this, "_RpcStub"); - } - // Although `hook` and `path` are declared `public` here, they are effectively hidden by the - // proxy. - constructor(hook, pathIfPromise) { - super(); - if (!(hook instanceof StubHook)) { - let value = hook; - if (value instanceof RpcTarget || value instanceof Function) { - hook = TargetStubHook.create(value, void 0); - } else { - hook = new PayloadStubHook(RpcPayload.fromAppReturn(value)); - } - if (pathIfPromise) { - throw new TypeError("RpcStub constructor expected one argument, received two."); - } - } - this.hook = hook; - this.pathIfPromise = pathIfPromise; - let func = /* @__PURE__ */ __name(() => { - }, "func"); - func.raw = this; - return new Proxy(func, PROXY_HANDLERS); - } - hook; - pathIfPromise; - dup() { - let target = this[RAW_STUB]; - if (target.pathIfPromise) { - return new _RpcStub(target.hook.get(target.pathIfPromise)); - } else { - return new _RpcStub(target.hook.dup()); - } - } - onRpcBroken(callback) { - this[RAW_STUB].hook.onBroken(callback); - } - map(func) { - let { hook, pathIfPromise } = this[RAW_STUB]; - return mapImpl.sendMap(hook, pathIfPromise || [], func); - } - toString() { - return "[object RpcStub]"; - } -}; -var RpcPromise = class extends RpcStub { - static { - __name(this, "RpcPromise"); - } - // TODO: Support passing target value or promise to constructor. - constructor(hook, pathIfPromise) { - super(hook, pathIfPromise); - } - then(onfulfilled, onrejected) { - return pullPromise(this).then(...arguments); - } - catch(onrejected) { - return pullPromise(this).catch(...arguments); - } - finally(onfinally) { - return pullPromise(this).finally(...arguments); - } - toString() { - return "[object RpcPromise]"; - } -}; -function unwrapStubTakingOwnership(stub) { - let { hook, pathIfPromise } = stub[RAW_STUB]; - if (pathIfPromise && pathIfPromise.length > 0) { - return hook.get(pathIfPromise); - } else { - return hook; - } -} -__name(unwrapStubTakingOwnership, "unwrapStubTakingOwnership"); -function unwrapStubAndDup(stub) { - let { hook, pathIfPromise } = stub[RAW_STUB]; - if (pathIfPromise) { - return hook.get(pathIfPromise); - } else { - return hook.dup(); - } -} -__name(unwrapStubAndDup, "unwrapStubAndDup"); -function unwrapStubNoProperties(stub) { - let { hook, pathIfPromise } = stub[RAW_STUB]; - if (pathIfPromise && pathIfPromise.length > 0) { - return void 0; - } - return hook; -} -__name(unwrapStubNoProperties, "unwrapStubNoProperties"); -function unwrapStubOrParent(stub) { - return stub[RAW_STUB].hook; -} -__name(unwrapStubOrParent, "unwrapStubOrParent"); -function unwrapStubAndPath(stub) { - return stub[RAW_STUB]; -} -__name(unwrapStubAndPath, "unwrapStubAndPath"); -async function pullPromise(promise) { - let { hook, pathIfPromise } = promise[RAW_STUB]; - if (pathIfPromise.length > 0) { - hook = hook.get(pathIfPromise); - } - let payload = await hook.pull(); - return payload.deliverResolve(); -} -__name(pullPromise, "pullPromise"); -var RpcPayload = class _RpcPayload { - static { - __name(this, "_RpcPayload"); - } - // Private constructor; use factory functions above to construct. - constructor(value, source, hooks, promises) { - this.value = value; - this.source = source; - this.hooks = hooks; - this.promises = promises; - } - // Create a payload from a value passed as params to an RPC from the app. - // - // The payload does NOT take ownership of any stubs in `value`, and but promises not to modify - // `value`. If the payload is delivered locally, `value` will be deep-copied first, so as not - // to have the sender and recipient end up sharing the same mutable object. `value` will not be - // touched again after the call returns synchronously (returns a promise) -- by that point, - // the value has either been copied or serialized to the wire. - static fromAppParams(value) { - return new _RpcPayload(value, "params"); - } - // Create a payload from a value return from an RPC implementation by the app. - // - // Unlike fromAppParams(), in this case the payload takes ownership of all stubs in `value`, and - // may hold onto `value` for an arbitrarily long time (e.g. to serve pipelined requests). It - // will still avoid modifying `value` and will make a deep copy if it is delivered locally. - static fromAppReturn(value) { - return new _RpcPayload(value, "return"); - } - // Combine an array of payloads into a single payload whose value is an array. Ownership of all - // stubs is transferred from the inputs to the outputs, hence if the output is disposed, the - // inputs should not be. (In case of exception, nothing is disposed, though.) - static fromArray(array) { - let hooks = []; - let promises = []; - let resultArray = []; - for (let payload of array) { - payload.ensureDeepCopied(); - for (let hook of payload.hooks) { - hooks.push(hook); - } - for (let promise of payload.promises) { - if (promise.parent === payload) { - promise = { - parent: resultArray, - property: resultArray.length, - promise: promise.promise - }; - } - promises.push(promise); - } - resultArray.push(payload.value); - } - return new _RpcPayload(resultArray, "owned", hooks, promises); - } - // Create a payload from a value parsed off the wire using Evaluator.evaluate(). - // - // A payload is constructed with a null value and the given hooks and promises arrays. The value - // is expected to be filled in by the evaluator, and the hooks and promises arrays are expected - // to be extended with stubs found during parsing. (This weird usage model is necessary so that - // if the root value turns out to be a promise, its `parent` in `promises` can be the payload - // object itself.) - // - // When done, the payload takes ownership of the final value and all the stubs within. It may - // modify the value in preparation for delivery, and may deliver the value directly to the app - // without copying. - static forEvaluate(hooks, promises) { - return new _RpcPayload(null, "owned", hooks, promises); - } - // Deep-copy the given value, including dup()ing all stubs. - // - // If `value` is a function, it should be bound to `oldParent` as its `this`. - // - // If deep-copying from a branch of some other RpcPayload, it must be provided, to make sure - // RpcTargets found within don't get duplicate stubs. - static deepCopyFrom(value, oldParent, owner) { - let result = new _RpcPayload(null, "owned", [], []); - result.value = result.deepCopy( - value, - oldParent, - "value", - result, - /*dupStubs=*/ - true, - owner - ); - return result; - } - // For `source === "return"` payloads only, this tracks any StubHooks created around RpcTargets - // or WritableStreams found in the payload at the time that it is serialized (or deep-copied) for - // return, so that we can make sure they are not disposed before the pipeline ends. - // - // This is initialized on first use. - rpcTargets; - // Get the StubHook representing the given RpcTarget found inside this payload. - getHookForRpcTarget(target, parent, dupStubs = true) { - if (this.source === "params") { - if (dupStubs) { - let dupable = target; - if (typeof dupable.dup === "function") { - target = dupable.dup(); - } - } - return TargetStubHook.create(target, parent); - } else if (this.source === "return") { - let hook = this.rpcTargets?.get(target); - if (hook) { - if (dupStubs) { - return hook.dup(); - } else { - this.rpcTargets?.delete(target); - return hook; - } - } else { - hook = TargetStubHook.create(target, parent); - if (dupStubs) { - if (!this.rpcTargets) { - this.rpcTargets = /* @__PURE__ */ new Map(); - } - this.rpcTargets.set(target, hook); - return hook.dup(); - } else { - return hook; - } - } - } else { - throw new Error("owned payload shouldn't contain raw RpcTargets"); - } - } - // Get the StubHook representing the given WritableStream found inside this payload. - getHookForWritableStream(stream, parent, dupStubs = true) { - if (this.source === "params") { - return streamImpl.createWritableStreamHook(stream); - } else if (this.source === "return") { - let hook = this.rpcTargets?.get(stream); - if (hook) { - if (dupStubs) { - return hook.dup(); - } else { - this.rpcTargets?.delete(stream); - return hook; - } - } else { - hook = streamImpl.createWritableStreamHook(stream); - if (dupStubs) { - if (!this.rpcTargets) { - this.rpcTargets = /* @__PURE__ */ new Map(); - } - this.rpcTargets.set(stream, hook); - return hook.dup(); - } else { - return hook; - } - } - } else { - throw new Error("owned payload shouldn't contain raw WritableStreams"); - } - } - // Get the StubHook representing the given ReadableStream found inside this payload. - getHookForReadableStream(stream, parent, dupStubs = true) { - if (this.source === "params") { - return streamImpl.createReadableStreamHook(stream); - } else if (this.source === "return") { - let hook = this.rpcTargets?.get(stream); - if (hook) { - if (dupStubs) { - return hook.dup(); - } else { - this.rpcTargets?.delete(stream); - return hook; - } - } else { - hook = streamImpl.createReadableStreamHook(stream); - if (dupStubs) { - if (!this.rpcTargets) { - this.rpcTargets = /* @__PURE__ */ new Map(); - } - this.rpcTargets.set(stream, hook); - return hook.dup(); - } else { - return hook; - } - } - } else { - throw new Error("owned payload shouldn't contain raw ReadableStreams"); - } - } - deepCopy(value, oldParent, property, parent, dupStubs, owner) { - let kind = typeForRpc(value); - switch (kind) { - case "unsupported": - return value; - case "primitive": - case "bigint": - case "date": - case "bytes": - case "error": - case "undefined": - return value; - case "array": { - let array = value; - let len = array.length; - let result = new Array(len); - for (let i = 0; i < len; i++) { - result[i] = this.deepCopy(array[i], array, i, result, dupStubs, owner); - } - return result; - } - case "object": { - let result = {}; - let object = value; - for (let i in object) { - result[i] = this.deepCopy(object[i], object, i, result, dupStubs, owner); - } - return result; - } - case "stub": - case "rpc-promise": { - let stub = value; - let hook; - if (dupStubs) { - hook = unwrapStubAndDup(stub); - } else { - hook = unwrapStubTakingOwnership(stub); - } - if (stub instanceof RpcPromise) { - let promise = new RpcPromise(hook, []); - this.promises.push({ parent, property, promise }); - return promise; - } else { - this.hooks.push(hook); - return new RpcStub(hook); - } - } - case "function": - case "rpc-target": { - let target = value; - let hook; - if (owner) { - hook = owner.getHookForRpcTarget(target, oldParent, dupStubs); - } else { - hook = TargetStubHook.create(target, oldParent); - } - this.hooks.push(hook); - return new RpcStub(hook); - } - case "rpc-thenable": { - let target = value; - let promise; - if (owner) { - promise = new RpcPromise(owner.getHookForRpcTarget(target, oldParent, dupStubs), []); - } else { - promise = new RpcPromise(TargetStubHook.create(target, oldParent), []); - } - this.promises.push({ parent, property, promise }); - return promise; - } - case "writable": { - let stream = value; - let hook; - if (owner) { - hook = owner.getHookForWritableStream(stream, oldParent, dupStubs); - } else { - hook = streamImpl.createWritableStreamHook(stream); - } - this.hooks.push(hook); - return stream; - } - case "readable": { - let stream = value; - let hook; - if (owner) { - hook = owner.getHookForReadableStream(stream, oldParent, dupStubs); - } else { - hook = streamImpl.createReadableStreamHook(stream); - } - this.hooks.push(hook); - return stream; - } - case "headers": - return new Headers(value); - case "request": { - let req = value; - if (req.body) { - this.deepCopy(req.body, req, "body", req, dupStubs, owner); - } - return new Request(req); - } - case "response": { - let resp = value; - if (resp.body) { - this.deepCopy(resp.body, resp, "body", resp, dupStubs, owner); - } - return new Response(resp.body, resp); - } - default: - throw new Error("unreachable"); - } - } - // Ensures that if the value originally came from an unowned source, we have replaced it with a - // deep copy. - ensureDeepCopied() { - if (this.source !== "owned") { - let dupStubs = this.source === "params"; - this.hooks = []; - this.promises = []; - try { - this.value = this.deepCopy(this.value, void 0, "value", this, dupStubs, this); - } catch (err) { - this.hooks = void 0; - this.promises = void 0; - throw err; - } - this.source = "owned"; - if (this.rpcTargets && this.rpcTargets.size > 0) { - throw new Error("Not all rpcTargets were accounted for in deep-copy?"); - } - this.rpcTargets = void 0; - } - } - // Resolve all promises in this payload and then assign the final value into `parent[property]`. - deliverTo(parent, property, promises) { - this.ensureDeepCopied(); - if (this.value instanceof RpcPromise) { - _RpcPayload.deliverRpcPromiseTo(this.value, parent, property, promises); - } else { - parent[property] = this.value; - for (let record of this.promises) { - _RpcPayload.deliverRpcPromiseTo(record.promise, record.parent, record.property, promises); - } - } - } - static deliverRpcPromiseTo(promise, parent, property, promises) { - let hook = unwrapStubNoProperties(promise); - if (!hook) { - throw new Error("property promises should have been resolved earlier"); - } - let inner = hook.pull(); - if (inner instanceof _RpcPayload) { - inner.deliverTo(parent, property, promises); - } else { - promises.push(inner.then((payload) => { - let subPromises = []; - payload.deliverTo(parent, property, subPromises); - if (subPromises.length > 0) { - return Promise.all(subPromises); - } - })); - } - } - // Call the given function with the payload as an argument. The call is made synchronously if - // possible, in order to maintain e-order. However, if any RpcPromises exist in the payload, - // they are awaited and substituted before calling the function. The result of the call is - // wrapped into another payload. - // - // The payload is automatically disposed after the call completes. The caller should not call - // dispose(). - async deliverCall(func, thisArg) { - try { - let promises = []; - this.deliverTo(this, "value", promises); - if (promises.length > 0) { - await Promise.all(promises); - } - let result = Function.prototype.apply.call(func, thisArg, this.value); - if (result instanceof RpcPromise) { - return _RpcPayload.fromAppReturn(result); - } else { - return _RpcPayload.fromAppReturn(await result); - } - } finally { - this.dispose(); - } - } - // Produce a promise for this payload for return to the application. Any RpcPromises in the - // payload are awaited and substituted with their results first. - // - // The returned object will have a disposer which disposes the payload. The caller should not - // separately dispose it. - async deliverResolve() { - try { - let promises = []; - this.deliverTo(this, "value", promises); - if (promises.length > 0) { - await Promise.all(promises); - } - let result = this.value; - if (result instanceof Object) { - if (!(Symbol.dispose in result)) { - Object.defineProperty(result, Symbol.dispose, { - // NOTE: Using `this.dispose.bind(this)` here causes Playwright's build of - // Chromium 140.0.7339.16 to fail when the object is assigned to a `using` variable, - // with the error: - // TypeError: Symbol(Symbol.dispose) is not a function - // I cannot reproduce this problem in Chrome 140.0.7339.127 nor in Node or workerd, - // so maybe it was a short-lived V8 bug or something. To be safe, though, we use - // `() => this.dispose()`, which seems to always work. - value: /* @__PURE__ */ __name(() => this.dispose(), "value"), - writable: true, - enumerable: false, - configurable: true - }); - } - } - return result; - } catch (err) { - this.dispose(); - throw err; - } - } - dispose() { - if (this.source === "owned") { - this.hooks.forEach((hook) => hook.dispose()); - this.promises.forEach((promise) => promise.promise[Symbol.dispose]()); - } else if (this.source === "return") { - this.disposeImpl(this.value, void 0); - if (this.rpcTargets && this.rpcTargets.size > 0) { - throw new Error("Not all rpcTargets were accounted for in disposeImpl()?"); - } - } else ; - this.source = "owned"; - this.hooks = []; - this.promises = []; - } - // Recursive dispose, called only when `source` is "return". - disposeImpl(value, parent) { - let kind = typeForRpc(value); - switch (kind) { - case "unsupported": - case "primitive": - case "bigint": - case "bytes": - case "date": - case "error": - case "undefined": - return; - case "array": { - let array = value; - let len = array.length; - for (let i = 0; i < len; i++) { - this.disposeImpl(array[i], array); - } - return; - } - case "object": { - let object = value; - for (let i in object) { - this.disposeImpl(object[i], object); - } - return; - } - case "stub": - case "rpc-promise": { - let stub = value; - let hook = unwrapStubNoProperties(stub); - if (hook) { - hook.dispose(); - } - return; - } - case "function": - case "rpc-target": { - let target = value; - let hook = this.rpcTargets?.get(target); - if (hook) { - hook.dispose(); - this.rpcTargets.delete(target); - } else { - disposeRpcTarget(target); - } - return; - } - case "rpc-thenable": - return; - case "headers": - return; - case "request": { - let req = value; - if (req.body) this.disposeImpl(req.body, req); - return; - } - case "response": { - let resp = value; - if (resp.body) this.disposeImpl(resp.body, resp); - return; - } - case "writable": { - let stream = value; - let hook = this.rpcTargets?.get(stream); - if (hook) { - this.rpcTargets.delete(stream); - } else { - hook = streamImpl.createWritableStreamHook(stream); - } - hook.dispose(); - return; - } - case "readable": { - let stream = value; - let hook = this.rpcTargets?.get(stream); - if (hook) { - this.rpcTargets.delete(stream); - } else { - hook = streamImpl.createReadableStreamHook(stream); - } - hook.dispose(); - return; - } - default: - return; - } - } - // Ignore unhandled rejections in all promises in this payload -- that is, all promises that - // *would* be awaited if this payload were to be delivered. See the similarly-named method of - // StubHook for explanation. - ignoreUnhandledRejections() { - if (this.hooks) { - this.hooks.forEach((hook) => { - hook.ignoreUnhandledRejections(); - }); - this.promises.forEach( - (promise) => unwrapStubOrParent(promise.promise).ignoreUnhandledRejections() - ); - } else { - this.ignoreUnhandledRejectionsImpl(this.value); - } - } - ignoreUnhandledRejectionsImpl(value) { - let kind = typeForRpc(value); - switch (kind) { - case "unsupported": - case "primitive": - case "bigint": - case "bytes": - case "date": - case "error": - case "undefined": - case "function": - case "rpc-target": - case "writable": - case "readable": - case "headers": - case "request": - case "response": - return; - case "array": { - let array = value; - let len = array.length; - for (let i = 0; i < len; i++) { - this.ignoreUnhandledRejectionsImpl(array[i]); - } - return; - } - case "object": { - let object = value; - for (let i in object) { - this.ignoreUnhandledRejectionsImpl(object[i]); - } - return; - } - case "stub": - case "rpc-promise": - unwrapStubOrParent(value).ignoreUnhandledRejections(); - return; - case "rpc-thenable": - value.then((_) => { - }, (_) => { - }); - return; - default: - return; - } - } -}; -function followPath(value, parent, path, owner) { - for (let i = 0; i < path.length; i++) { - parent = value; - let part = path[i]; - if (part in Object.prototype) { - value = void 0; - continue; - } - let kind = typeForRpc(value); - switch (kind) { - case "object": - case "function": - if (Object.hasOwn(value, part)) { - value = value[part]; - } else { - value = void 0; - } - break; - case "array": - if (Number.isInteger(part) && part >= 0) { - value = value[part]; - } else { - value = void 0; - } - break; - case "rpc-target": - case "rpc-thenable": { - if (Object.hasOwn(value, part)) { - throw new TypeError( - `Attempted to access property '${part}', which is an instance property of the RpcTarget. To avoid leaking private internals, instance properties cannot be accessed over RPC. If you want to make this property available over RPC, define it as a method or getter on the class, instead of an instance property.` - ); - } else { - value = value[part]; - } - owner = null; - break; - } - case "stub": - case "rpc-promise": { - let { hook, pathIfPromise } = unwrapStubAndPath(value); - return { hook, remainingPath: pathIfPromise ? pathIfPromise.concat(path.slice(i)) : path.slice(i) }; - } - case "writable": - value = void 0; - break; - case "readable": - value = void 0; - break; - case "primitive": - case "bigint": - case "bytes": - case "date": - case "error": - case "headers": - case "request": - case "response": - value = void 0; - break; - case "undefined": - value = value[part]; - break; - case "unsupported": { - if (i === 0) { - throw new TypeError(`RPC stub points at a non-serializable type.`); - } else { - let prefix = path.slice(0, i).join("."); - let remainder = path.slice(0, i).join("."); - throw new TypeError( - `'${prefix}' is not a serializable type, so property ${remainder} cannot be accessed.` - ); - } - } - default: - throw new TypeError("unreachable"); - } - } - if (value instanceof RpcPromise) { - let { hook, pathIfPromise } = unwrapStubAndPath(value); - return { hook, remainingPath: pathIfPromise || [] }; - } - return { - value, - parent, - owner - }; -} -__name(followPath, "followPath"); -var ValueStubHook = class extends StubHook { - static { - __name(this, "ValueStubHook"); - } - call(path, args) { - try { - let { value, owner } = this.getValue(); - let followResult = followPath(value, void 0, path, owner); - if (followResult.hook) { - return followResult.hook.call(followResult.remainingPath, args); - } - if (typeof followResult.value != "function") { - throw new TypeError(`'${path.join(".")}' is not a function.`); - } - let promise = args.deliverCall(followResult.value, followResult.parent); - return new PromiseStubHook(promise.then((payload) => { - return new PayloadStubHook(payload); - })); - } catch (err) { - return new ErrorStubHook(err); - } - } - map(path, captures, instructions) { - try { - let followResult; - try { - let { value, owner } = this.getValue(); - followResult = followPath(value, void 0, path, owner); - ; - } catch (err) { - for (let cap of captures) { - cap.dispose(); - } - throw err; - } - if (followResult.hook) { - return followResult.hook.map(followResult.remainingPath, captures, instructions); - } - return mapImpl.applyMap( - followResult.value, - followResult.parent, - followResult.owner, - captures, - instructions - ); - } catch (err) { - return new ErrorStubHook(err); - } - } - get(path) { - try { - let { value, owner } = this.getValue(); - if (path.length === 0 && owner === null) { - throw new Error("Can't dup an RpcTarget stub as a promise."); - } - let followResult = followPath(value, void 0, path, owner); - if (followResult.hook) { - return followResult.hook.get(followResult.remainingPath); - } - return new PayloadStubHook(RpcPayload.deepCopyFrom( - followResult.value, - followResult.parent, - followResult.owner - )); - } catch (err) { - return new ErrorStubHook(err); - } - } -}; -var PayloadStubHook = class _PayloadStubHook extends ValueStubHook { - static { - __name(this, "_PayloadStubHook"); - } - constructor(payload) { - super(); - this.payload = payload; - } - payload; - // cleared when disposed - getPayload() { - if (this.payload) { - return this.payload; - } else { - throw new Error("Attempted to use an RPC StubHook after it was disposed."); - } - } - getValue() { - let payload = this.getPayload(); - return { value: payload.value, owner: payload }; - } - dup() { - let thisPayload = this.getPayload(); - return new _PayloadStubHook(RpcPayload.deepCopyFrom( - thisPayload.value, - void 0, - thisPayload - )); - } - pull() { - return this.getPayload(); - } - ignoreUnhandledRejections() { - if (this.payload) { - this.payload.ignoreUnhandledRejections(); - } - } - dispose() { - if (this.payload) { - this.payload.dispose(); - this.payload = void 0; - } - } - onBroken(callback) { - if (this.payload) { - if (this.payload.value instanceof RpcStub) { - this.payload.value.onRpcBroken(callback); - } - } - } -}; -function disposeRpcTarget(target) { - if (Symbol.dispose in target) { - try { - target[Symbol.dispose](); - } catch (err) { - Promise.reject(err); - } - } -} -__name(disposeRpcTarget, "disposeRpcTarget"); -var TargetStubHook = class _TargetStubHook extends ValueStubHook { - static { - __name(this, "_TargetStubHook"); - } - // Constructs a TargetStubHook that is not duplicated from an existing hook. - // - // If `value` is a function, `parent` is bound as its "this". - static create(value, parent) { - if (typeof value !== "function") { - parent = void 0; - } - return new _TargetStubHook(value, parent); - } - constructor(target, parent, dupFrom) { - super(); - this.target = target; - this.parent = parent; - if (dupFrom) { - if (dupFrom.refcount) { - this.refcount = dupFrom.refcount; - ++this.refcount.count; - } - } else if (Symbol.dispose in target) { - this.refcount = { count: 1 }; - } - } - target; - // cleared when disposed - parent; - // `this` parameter when calling `target` - refcount; - // undefined if not needed (because target has no disposer) - getTarget() { - if (this.target) { - return this.target; - } else { - throw new Error("Attempted to use an RPC StubHook after it was disposed."); - } - } - getValue() { - return { value: this.getTarget(), owner: null }; - } - dup() { - return new _TargetStubHook(this.getTarget(), this.parent, this); - } - pull() { - let target = this.getTarget(); - if ("then" in target) { - return Promise.resolve(target).then((resolution) => { - return RpcPayload.fromAppReturn(resolution); - }); - } else { - return Promise.reject(new Error("Tried to resolve a non-promise stub.")); - } - } - ignoreUnhandledRejections() { - } - dispose() { - if (this.target) { - if (this.refcount) { - if (--this.refcount.count == 0) { - disposeRpcTarget(this.target); - } - } - this.target = void 0; - } - } - onBroken(callback) { - } -}; -var PromiseStubHook = class _PromiseStubHook extends StubHook { - static { - __name(this, "_PromiseStubHook"); - } - promise; - resolution; - constructor(promise) { - super(); - this.promise = promise.then((res) => { - this.resolution = res; - return res; - }); - } - call(path, args) { - args.ensureDeepCopied(); - return new _PromiseStubHook(this.promise.then((hook) => hook.call(path, args))); - } - stream(path, args) { - args.ensureDeepCopied(); - let promise = this.promise.then((hook) => { - let result = hook.stream(path, args); - return result.promise; - }); - return { promise }; - } - map(path, captures, instructions) { - return new _PromiseStubHook(this.promise.then( - (hook) => hook.map(path, captures, instructions), - (err) => { - for (let cap of captures) { - cap.dispose(); - } - throw err; - } - )); - } - get(path) { - return new _PromiseStubHook(this.promise.then((hook) => hook.get(path))); - } - dup() { - if (this.resolution) { - return this.resolution.dup(); - } else { - return new _PromiseStubHook(this.promise.then((hook) => hook.dup())); - } - } - pull() { - if (this.resolution) { - return this.resolution.pull(); - } else { - return this.promise.then((hook) => hook.pull()); - } - } - ignoreUnhandledRejections() { - if (this.resolution) { - this.resolution.ignoreUnhandledRejections(); - } else { - this.promise.then((res) => { - res.ignoreUnhandledRejections(); - }, (err) => { - }); - } - } - dispose() { - if (this.resolution) { - this.resolution.dispose(); - } else { - this.promise.then((hook) => { - hook.dispose(); - }, (err) => { - }); - } - } - onBroken(callback) { - if (this.resolution) { - this.resolution.onBroken(callback); - } else { - this.promise.then((hook) => { - hook.onBroken(callback); - }, callback); - } - } -}; -var NullExporter = class { - static { - __name(this, "NullExporter"); - } - exportStub(stub) { - throw new Error("Cannot serialize RPC stubs without an RPC session."); - } - exportPromise(stub) { - throw new Error("Cannot serialize RPC stubs without an RPC session."); - } - getImport(hook) { - return void 0; - } - unexport(ids) { - } - createPipe(readable) { - throw new Error("Cannot create pipes without an RPC session."); - } - onSendError(error) { - } -}; -var NULL_EXPORTER = new NullExporter(); -var ERROR_TYPES = { - Error, - EvalError, - RangeError, - ReferenceError, - SyntaxError, - TypeError, - URIError, - AggregateError - // TODO: DOMError? Others? -}; -var Devaluator = class _Devaluator { - static { - __name(this, "_Devaluator"); - } - constructor(exporter, source) { - this.exporter = exporter; - this.source = source; - } - // Devaluate the given value. - // * value: The value to devaluate. - // * parent: The value's parent object, which would be used as `this` if the value were called - // as a function. - // * exporter: Callbacks to the RPC session for exporting capabilities found in this message. - // * source: The RpcPayload which contains the value, and therefore owns stubs within. - // - // Returns: The devaluated value, ready to be JSON-serialized. - static devaluate(value, parent, exporter = NULL_EXPORTER, source) { - let devaluator = new _Devaluator(exporter, source); - try { - return devaluator.devaluateImpl(value, parent, 0); - } catch (err) { - if (devaluator.exports) { - try { - exporter.unexport(devaluator.exports); - } catch (err2) { - } - } - throw err; - } - } - exports; - devaluateImpl(value, parent, depth) { - if (depth >= 64) { - throw new Error( - "Serialization exceeded maximum allowed depth. (Does the message contain cycles?)" - ); - } - let kind = typeForRpc(value); - switch (kind) { - case "unsupported": { - let msg; - try { - msg = `Cannot serialize value: ${value}`; - } catch (err) { - msg = "Cannot serialize value: (couldn't stringify value)"; - } - throw new TypeError(msg); - } - case "primitive": - if (typeof value === "number" && !isFinite(value)) { - if (value === Infinity) { - return ["inf"]; - } else if (value === -Infinity) { - return ["-inf"]; - } else { - return ["nan"]; - } - } else { - return value; - } - case "object": { - let object = value; - let result = {}; - for (let key in object) { - result[key] = this.devaluateImpl(object[key], object, depth + 1); - } - return result; - } - case "array": { - let array = value; - let len = array.length; - let result = new Array(len); - for (let i = 0; i < len; i++) { - result[i] = this.devaluateImpl(array[i], array, depth + 1); - } - return [result]; - } - case "bigint": - return ["bigint", value.toString()]; - case "date": - return ["date", value.getTime()]; - case "bytes": { - let bytes = value; - if (bytes.toBase64) { - return ["bytes", bytes.toBase64({ omitPadding: true })]; - } else { - return [ - "bytes", - btoa(String.fromCharCode.apply(null, bytes).replace(/=*$/, "")) - ]; - } - } - case "headers": - return ["headers", [...value]]; - case "request": { - let req = value; - let init = {}; - if (req.method !== "GET") init.method = req.method; - let headers = [...req.headers]; - if (headers.length > 0) { - init.headers = headers; - } - if (req.body) { - init.body = this.devaluateImpl(req.body, req, depth + 1); - init.duplex = req.duplex || "half"; - } else if (req.body === void 0 && !["GET", "HEAD", "OPTIONS", "TRACE", "DELETE"].includes(req.method)) { - let bodyPromise = req.arrayBuffer(); - let readable = new ReadableStream({ - async start(controller) { - try { - controller.enqueue(new Uint8Array(await bodyPromise)); - controller.close(); - } catch (err) { - controller.error(err); - } - } - }); - let hook = streamImpl.createReadableStreamHook(readable); - let importId = this.exporter.createPipe(readable, hook); - init.body = ["readable", importId]; - init.duplex = req.duplex || "half"; - } - if (req.cache && req.cache !== "default") init.cache = req.cache; - if (req.redirect !== "follow") init.redirect = req.redirect; - if (req.integrity) init.integrity = req.integrity; - if (req.mode && req.mode !== "cors") init.mode = req.mode; - if (req.credentials && req.credentials !== "same-origin") { - init.credentials = req.credentials; - } - if (req.referrer && req.referrer !== "about:client") init.referrer = req.referrer; - if (req.referrerPolicy) init.referrerPolicy = req.referrerPolicy; - if (req.keepalive) init.keepalive = req.keepalive; - let cfReq = req; - if (cfReq.cf) init.cf = cfReq.cf; - if (cfReq.encodeResponseBody && cfReq.encodeResponseBody !== "automatic") { - init.encodeResponseBody = cfReq.encodeResponseBody; - } - return ["request", req.url, init]; - } - case "response": { - let resp = value; - let body = this.devaluateImpl(resp.body, resp, depth + 1); - let init = {}; - if (resp.status !== 200) init.status = resp.status; - if (resp.statusText) init.statusText = resp.statusText; - let headers = [...resp.headers]; - if (headers.length > 0) { - init.headers = headers; - } - let cfResp = resp; - if (cfResp.cf) init.cf = cfResp.cf; - if (cfResp.encodeBody && cfResp.encodeBody !== "automatic") { - init.encodeBody = cfResp.encodeBody; - } - if (cfResp.webSocket) { - throw new TypeError("Can't serialize a Response containing a webSocket."); - } - return ["response", body, init]; - } - case "error": { - let e = value; - let rewritten = this.exporter.onSendError(e); - if (rewritten) { - e = rewritten; - } - let result = ["error", e.name, e.message]; - if (rewritten && rewritten.stack) { - result.push(rewritten.stack); - } - return result; - } - case "undefined": - return ["undefined"]; - case "stub": - case "rpc-promise": { - if (!this.source) { - throw new Error("Can't serialize RPC stubs in this context."); - } - let { hook, pathIfPromise } = unwrapStubAndPath(value); - let importId = this.exporter.getImport(hook); - if (importId !== void 0) { - if (pathIfPromise) { - if (pathIfPromise.length > 0) { - return ["pipeline", importId, pathIfPromise]; - } else { - return ["pipeline", importId]; - } - } else { - return ["import", importId]; - } - } - if (pathIfPromise) { - hook = hook.get(pathIfPromise); - } else { - hook = hook.dup(); - } - return this.devaluateHook(pathIfPromise ? "promise" : "export", hook); - } - case "function": - case "rpc-target": { - if (!this.source) { - throw new Error("Can't serialize RPC stubs in this context."); - } - let hook = this.source.getHookForRpcTarget(value, parent); - return this.devaluateHook("export", hook); - } - case "rpc-thenable": { - if (!this.source) { - throw new Error("Can't serialize RPC stubs in this context."); - } - let hook = this.source.getHookForRpcTarget(value, parent); - return this.devaluateHook("promise", hook); - } - case "writable": { - if (!this.source) { - throw new Error("Can't serialize WritableStream in this context."); - } - let hook = this.source.getHookForWritableStream(value, parent); - return this.devaluateHook("writable", hook); - } - case "readable": { - if (!this.source) { - throw new Error("Can't serialize ReadableStream in this context."); - } - let ws = value; - let hook = this.source.getHookForReadableStream(ws, parent); - let importId = this.exporter.createPipe(ws, hook); - return ["readable", importId]; - } - default: - throw new Error("unreachable"); - } - } - devaluateHook(type, hook) { - if (!this.exports) this.exports = []; - let exportId = type === "promise" ? this.exporter.exportPromise(hook) : this.exporter.exportStub(hook); - this.exports.push(exportId); - return [type, exportId]; - } -}; -var NullImporter = class { - static { - __name(this, "NullImporter"); - } - importStub(idx) { - throw new Error("Cannot deserialize RPC stubs without an RPC session."); - } - importPromise(idx) { - throw new Error("Cannot deserialize RPC stubs without an RPC session."); - } - getExport(idx) { - return void 0; - } - getPipeReadable(exportId) { - throw new Error("Cannot retrieve pipe readable without an RPC session."); - } -}; -var NULL_IMPORTER = new NullImporter(); -function fixBrokenRequestBody(request, body) { - let promise = new Response(body).arrayBuffer().then((arrayBuffer) => { - let bytes = new Uint8Array(arrayBuffer); - let result = new Request(request, { body: bytes }); - return new PayloadStubHook(RpcPayload.fromAppReturn(result)); - }); - return new RpcPromise(new PromiseStubHook(promise), []); -} -__name(fixBrokenRequestBody, "fixBrokenRequestBody"); -var Evaluator = class _Evaluator { - static { - __name(this, "_Evaluator"); - } - constructor(importer) { - this.importer = importer; - } - hooks = []; - promises = []; - evaluate(value) { - let payload = RpcPayload.forEvaluate(this.hooks, this.promises); - try { - payload.value = this.evaluateImpl(value, payload, "value"); - return payload; - } catch (err) { - payload.dispose(); - throw err; - } - } - // Evaluate the value without destroying it. - evaluateCopy(value) { - return this.evaluate(structuredClone(value)); - } - evaluateImpl(value, parent, property) { - if (value instanceof Array) { - if (value.length == 1 && value[0] instanceof Array) { - let result = value[0]; - for (let i = 0; i < result.length; i++) { - result[i] = this.evaluateImpl(result[i], result, i); - } - return result; - } else switch (value[0]) { - case "bigint": - if (typeof value[1] == "string") { - return BigInt(value[1]); - } - break; - case "date": - if (typeof value[1] == "number") { - return new Date(value[1]); - } - break; - case "bytes": { - let b64 = Uint8Array; - if (typeof value[1] == "string") { - if (b64.fromBase64) { - return b64.fromBase64(value[1]); - } else { - let bs = atob(value[1]); - let len = bs.length; - let bytes = new Uint8Array(len); - for (let i = 0; i < len; i++) { - bytes[i] = bs.charCodeAt(i); - } - return bytes; - } - } - break; - } - case "error": - if (value.length >= 3 && typeof value[1] === "string" && typeof value[2] === "string") { - let cls = ERROR_TYPES[value[1]] || Error; - let result = new cls(value[2]); - if (typeof value[3] === "string") { - result.stack = value[3]; - } - return result; - } - break; - case "undefined": - if (value.length === 1) { - return void 0; - } - break; - case "inf": - return Infinity; - case "-inf": - return -Infinity; - case "nan": - return NaN; - case "headers": - if (value.length === 2 && value[1] instanceof Array) { - return new Headers(value[1]); - } - break; - case "request": { - if (value.length !== 3 || typeof value[1] !== "string") break; - let url = value[1]; - let init = value[2]; - if (typeof init !== "object" || init === null) break; - if (init.body) { - init.body = this.evaluateImpl(init.body, init, "body"); - if (init.body === null || typeof init.body === "string" || init.body instanceof Uint8Array || init.body instanceof ReadableStream) ; - else { - throw new TypeError("Request body must be of type ReadableStream."); - } - } - if (init.signal) { - init.signal = this.evaluateImpl(init.signal, init, "signal"); - if (!(init.signal instanceof AbortSignal)) { - throw new TypeError("Request siganl must be of type AbortSignal."); - } - } - if (init.headers && !(init.headers instanceof Array)) { - throw new TypeError("Request headers must be serialized as an array of pairs."); - } - let result = new Request(url, init); - if (init.body instanceof ReadableStream && result.body === void 0) { - let promise = fixBrokenRequestBody(result, init.body); - this.promises.push({ promise, parent, property }); - return promise; - } else { - return result; - } - } - case "response": { - if (value.length !== 3) break; - let body = this.evaluateImpl(value[1], parent, property); - if (body === null || typeof body === "string" || body instanceof Uint8Array || body instanceof ReadableStream) ; - else { - throw new TypeError("Response body must be of type ReadableStream."); - } - let init = value[2]; - if (typeof init !== "object" || init === null) break; - if (init.webSocket) { - throw new TypeError("Can't deserialize a Response containing a webSocket."); - } - if (init.headers && !(init.headers instanceof Array)) { - throw new TypeError("Request headers must be serialized as an array of pairs."); - } - return new Response(body, init); - } - case "import": - case "pipeline": { - if (value.length < 2 || value.length > 4) { - break; - } - if (typeof value[1] != "number") { - break; - } - let hook = this.importer.getExport(value[1]); - if (!hook) { - throw new Error(`no such entry on exports table: ${value[1]}`); - } - let isPromise = value[0] == "pipeline"; - let addStub = /* @__PURE__ */ __name((hook2) => { - if (isPromise) { - let promise = new RpcPromise(hook2, []); - this.promises.push({ promise, parent, property }); - return promise; - } else { - this.hooks.push(hook2); - return new RpcPromise(hook2, []); - } - }, "addStub"); - if (value.length == 2) { - if (isPromise) { - return addStub(hook.get([])); - } else { - return addStub(hook.dup()); - } - } - let path = value[2]; - if (!(path instanceof Array)) { - break; - } - if (!path.every( - (part) => { - return typeof part == "string" || typeof part == "number"; - } - )) { - break; - } - if (value.length == 3) { - return addStub(hook.get(path)); - } - let args = value[3]; - if (!(args instanceof Array)) { - break; - } - let subEval = new _Evaluator(this.importer); - args = subEval.evaluate([args]); - return addStub(hook.call(path, args)); - } - case "remap": { - if (value.length !== 5 || typeof value[1] !== "number" || !(value[2] instanceof Array) || !(value[3] instanceof Array) || !(value[4] instanceof Array)) { - break; - } - let hook = this.importer.getExport(value[1]); - if (!hook) { - throw new Error(`no such entry on exports table: ${value[1]}`); - } - let path = value[2]; - if (!path.every( - (part) => { - return typeof part == "string" || typeof part == "number"; - } - )) { - break; - } - let captures = value[3].map((cap) => { - if (!(cap instanceof Array) || cap.length !== 2 || cap[0] !== "import" && cap[0] !== "export" || typeof cap[1] !== "number") { - throw new TypeError(`unknown map capture: ${JSON.stringify(cap)}`); - } - if (cap[0] === "export") { - return this.importer.importStub(cap[1]); - } else { - let exp = this.importer.getExport(cap[1]); - if (!exp) { - throw new Error(`no such entry on exports table: ${cap[1]}`); - } - return exp.dup(); - } - }); - let instructions = value[4]; - let resultHook = hook.map(path, captures, instructions); - let promise = new RpcPromise(resultHook, []); - this.promises.push({ promise, parent, property }); - return promise; - } - case "export": - case "promise": - if (typeof value[1] == "number") { - if (value[0] == "promise") { - let hook = this.importer.importPromise(value[1]); - let promise = new RpcPromise(hook, []); - this.promises.push({ parent, property, promise }); - return promise; - } else { - let hook = this.importer.importStub(value[1]); - this.hooks.push(hook); - return new RpcStub(hook); - } - } - break; - case "writable": - if (typeof value[1] == "number") { - let hook = this.importer.importStub(value[1]); - let stream = streamImpl.createWritableStreamFromHook(hook); - this.hooks.push(hook); - return stream; - } - break; - case "readable": - if (typeof value[1] == "number") { - let stream = this.importer.getPipeReadable(value[1]); - let hook = streamImpl.createReadableStreamHook(stream); - this.hooks.push(hook); - return stream; - } - break; - } - throw new TypeError(`unknown special value: ${JSON.stringify(value)}`); - } else if (value instanceof Object) { - let result = value; - for (let key in result) { - if (key in Object.prototype || key === "toJSON") { - this.evaluateImpl(result[key], result, key); - delete result[key]; - } else { - result[key] = this.evaluateImpl(result[key], result, key); - } - } - return result; - } else { - return value; - } - } -}; -var ImportTableEntry = class { - static { - __name(this, "ImportTableEntry"); - } - constructor(session, importId, pulling) { - this.session = session; - this.importId = importId; - if (pulling) { - this.activePull = Promise.withResolvers(); - } - } - localRefcount = 0; - remoteRefcount = 1; - activePull; - resolution; - // List of integer indexes into session.onBrokenCallbacks which are callbacks registered on - // this import. Initialized on first use (so `undefined` is the same as an empty list). - onBrokenRegistrations; - resolve(resolution) { - if (this.localRefcount == 0) { - resolution.dispose(); - return; - } - this.resolution = resolution; - this.sendRelease(); - if (this.onBrokenRegistrations) { - for (let i of this.onBrokenRegistrations) { - let callback = this.session.onBrokenCallbacks[i]; - let endIndex = this.session.onBrokenCallbacks.length; - resolution.onBroken(callback); - if (this.session.onBrokenCallbacks[endIndex] === callback) { - delete this.session.onBrokenCallbacks[endIndex]; - } else { - delete this.session.onBrokenCallbacks[i]; - } - } - this.onBrokenRegistrations = void 0; - } - if (this.activePull) { - this.activePull.resolve(); - this.activePull = void 0; - } - } - async awaitResolution() { - if (!this.activePull) { - this.session.sendPull(this.importId); - this.activePull = Promise.withResolvers(); - } - await this.activePull.promise; - return this.resolution.pull(); - } - dispose() { - if (this.resolution) { - this.resolution.dispose(); - } else { - this.abort(new Error("RPC was canceled because the RpcPromise was disposed.")); - this.sendRelease(); - } - } - abort(error) { - if (!this.resolution) { - this.resolution = new ErrorStubHook(error); - if (this.activePull) { - this.activePull.reject(error); - this.activePull = void 0; - } - this.onBrokenRegistrations = void 0; - } - } - onBroken(callback) { - if (this.resolution) { - this.resolution.onBroken(callback); - } else { - let index = this.session.onBrokenCallbacks.length; - this.session.onBrokenCallbacks.push(callback); - if (!this.onBrokenRegistrations) this.onBrokenRegistrations = []; - this.onBrokenRegistrations.push(index); - } - } - sendRelease() { - if (this.remoteRefcount > 0) { - this.session.sendRelease(this.importId, this.remoteRefcount); - this.remoteRefcount = 0; - } - } -}; -var RpcImportHook = class _RpcImportHook extends StubHook { - static { - __name(this, "_RpcImportHook"); - } - // undefined when we're disposed - // `pulling` is true if we already expect that this import is going to be resolved later, and - // null if this import is not allowed to be pulled (i.e. it's a stub not a promise). - constructor(isPromise, entry) { - super(); - this.isPromise = isPromise; - ++entry.localRefcount; - this.entry = entry; - } - entry; - collectPath(path) { - return this; - } - getEntry() { - if (this.entry) { - return this.entry; - } else { - throw new Error("This RpcImportHook was already disposed."); - } - } - // ------------------------------------------------------------------------------------- - // implements StubHook - call(path, args) { - let entry = this.getEntry(); - if (entry.resolution) { - return entry.resolution.call(path, args); - } else { - return entry.session.sendCall(entry.importId, path, args); - } - } - stream(path, args) { - let entry = this.getEntry(); - if (entry.resolution) { - return entry.resolution.stream(path, args); - } else { - return entry.session.sendStream(entry.importId, path, args); - } - } - map(path, captures, instructions) { - let entry; - try { - entry = this.getEntry(); - } catch (err) { - for (let cap of captures) { - cap.dispose(); - } - throw err; - } - if (entry.resolution) { - return entry.resolution.map(path, captures, instructions); - } else { - return entry.session.sendMap(entry.importId, path, captures, instructions); - } - } - get(path) { - let entry = this.getEntry(); - if (entry.resolution) { - return entry.resolution.get(path); - } else { - return entry.session.sendCall(entry.importId, path); - } - } - dup() { - return new _RpcImportHook(false, this.getEntry()); - } - pull() { - let entry = this.getEntry(); - if (!this.isPromise) { - throw new Error("Can't pull this hook because it's not a promise hook."); - } - if (entry.resolution) { - return entry.resolution.pull(); - } - return entry.awaitResolution(); - } - ignoreUnhandledRejections() { - } - dispose() { - let entry = this.entry; - this.entry = void 0; - if (entry) { - if (--entry.localRefcount === 0) { - entry.dispose(); - } - } - } - onBroken(callback) { - if (this.entry) { - this.entry.onBroken(callback); - } - } -}; -var RpcMainHook = class extends RpcImportHook { - static { - __name(this, "RpcMainHook"); - } - session; - constructor(entry) { - super(false, entry); - this.session = entry.session; - } - dispose() { - if (this.session) { - let session = this.session; - this.session = void 0; - session.shutdown(); - } - } -}; -var RpcSessionImpl = class { - static { - __name(this, "RpcSessionImpl"); - } - constructor(transport, mainHook, options) { - this.transport = transport; - this.options = options; - this.exports.push({ hook: mainHook, refcount: 1 }); - this.imports.push(new ImportTableEntry(this, 0, false)); - let rejectFunc; - let abortPromise = new Promise((resolve, reject) => { - rejectFunc = reject; - }); - this.cancelReadLoop = rejectFunc; - this.readLoop(abortPromise).catch((err) => this.abort(err)); - } - exports = []; - reverseExports = /* @__PURE__ */ new Map(); - imports = []; - abortReason; - cancelReadLoop; - // We assign positive numbers to imports we initiate, and negative numbers to exports we - // initiate. So the next import ID is just `imports.length`, but the next export ID needs - // to be tracked explicitly. - nextExportId = -1; - // If set, call this when all incoming calls are complete. - onBatchDone; - // How many promises is our peer expecting us to resolve? - pullCount = 0; - // Sparse array of onBrokenCallback registrations. Items are strictly appended to the end but - // may be deleted from the middle (hence leaving the array sparse). - onBrokenCallbacks = []; - // Should only be called once immediately after construction. - getMainImport() { - return new RpcMainHook(this.imports[0]); - } - shutdown() { - this.abort(new Error("RPC session was shut down by disposing the main stub"), false); - } - exportStub(hook) { - if (this.abortReason) throw this.abortReason; - let existingExportId = this.reverseExports.get(hook); - if (existingExportId !== void 0) { - ++this.exports[existingExportId].refcount; - return existingExportId; - } else { - let exportId = this.nextExportId--; - this.exports[exportId] = { hook, refcount: 1 }; - this.reverseExports.set(hook, exportId); - return exportId; - } - } - exportPromise(hook) { - if (this.abortReason) throw this.abortReason; - let exportId = this.nextExportId--; - this.exports[exportId] = { hook, refcount: 1 }; - this.reverseExports.set(hook, exportId); - this.ensureResolvingExport(exportId); - return exportId; - } - unexport(ids) { - for (let id of ids) { - this.releaseExport(id, 1); - } - } - releaseExport(exportId, refcount) { - let entry = this.exports[exportId]; - if (!entry) { - throw new Error(`no such export ID: ${exportId}`); - } - if (entry.refcount < refcount) { - throw new Error(`refcount would go negative: ${entry.refcount} < ${refcount}`); - } - entry.refcount -= refcount; - if (entry.refcount === 0) { - delete this.exports[exportId]; - this.reverseExports.delete(entry.hook); - entry.hook.dispose(); - } - } - onSendError(error) { - if (this.options.onSendError) { - return this.options.onSendError(error); - } - } - ensureResolvingExport(exportId) { - let exp = this.exports[exportId]; - if (!exp) { - throw new Error(`no such export ID: ${exportId}`); - } - if (!exp.pull) { - let resolve = /* @__PURE__ */ __name(async () => { - let hook = exp.hook; - for (; ; ) { - let payload = await hook.pull(); - if (payload.value instanceof RpcStub) { - let { hook: inner, pathIfPromise } = unwrapStubAndPath(payload.value); - if (pathIfPromise && pathIfPromise.length == 0) { - if (this.getImport(hook) === void 0) { - hook = inner; - continue; - } - } - } - return payload; - } - }, "resolve"); - let autoRelease = exp.autoRelease; - ++this.pullCount; - exp.pull = resolve().then( - (payload) => { - let value = Devaluator.devaluate(payload.value, void 0, this, payload); - this.send(["resolve", exportId, value]); - if (autoRelease) this.releaseExport(exportId, 1); - }, - (error) => { - this.send(["reject", exportId, Devaluator.devaluate(error, void 0, this)]); - if (autoRelease) this.releaseExport(exportId, 1); - } - ).catch( - (error) => { - try { - this.send(["reject", exportId, Devaluator.devaluate(error, void 0, this)]); - if (autoRelease) this.releaseExport(exportId, 1); - } catch (error2) { - this.abort(error2); - } - } - ).finally(() => { - if (--this.pullCount === 0) { - if (this.onBatchDone) { - this.onBatchDone.resolve(); - } - } - }); - } - } - getImport(hook) { - if (hook instanceof RpcImportHook && hook.entry && hook.entry.session === this) { - return hook.entry.importId; - } else { - return void 0; - } - } - importStub(idx) { - if (this.abortReason) throw this.abortReason; - let entry = this.imports[idx]; - if (!entry) { - entry = new ImportTableEntry(this, idx, false); - this.imports[idx] = entry; - } - return new RpcImportHook( - /*isPromise=*/ - false, - entry - ); - } - importPromise(idx) { - if (this.abortReason) throw this.abortReason; - if (this.imports[idx]) { - return new ErrorStubHook(new Error( - "Bug in RPC system: The peer sent a promise reusing an existing export ID." - )); - } - let entry = new ImportTableEntry(this, idx, true); - this.imports[idx] = entry; - return new RpcImportHook( - /*isPromise=*/ - true, - entry - ); - } - getExport(idx) { - return this.exports[idx]?.hook; - } - getPipeReadable(exportId) { - let entry = this.exports[exportId]; - if (!entry || !entry.pipeReadable) { - throw new Error(`Export ${exportId} is not a pipe or its readable end was already consumed.`); - } - let readable = entry.pipeReadable; - entry.pipeReadable = void 0; - return readable; - } - createPipe(readable, readableHook) { - if (this.abortReason) throw this.abortReason; - this.send(["pipe"]); - let importId = this.imports.length; - let entry = new ImportTableEntry(this, importId, false); - this.imports.push(entry); - let hook = new RpcImportHook( - /*isPromise=*/ - false, - entry - ); - let writable = streamImpl.createWritableStreamFromHook(hook); - readable.pipeTo(writable).catch(() => { - }).finally(() => readableHook.dispose()); - return importId; - } - // Serializes and sends a message. Returns the byte length of the serialized message. - send(msg) { - if (this.abortReason !== void 0) { - return 0; - } - let msgText; - try { - msgText = JSON.stringify(msg); - } catch (err) { - try { - this.abort(err); - } catch (err2) { - } - throw err; - } - this.transport.send(msgText).catch((err) => this.abort(err, false)); - return msgText.length; - } - sendCall(id, path, args) { - if (this.abortReason) throw this.abortReason; - let value = ["pipeline", id, path]; - if (args) { - let devalue = Devaluator.devaluate(args.value, void 0, this, args); - value.push(devalue[0]); - } - this.send(["push", value]); - let entry = new ImportTableEntry(this, this.imports.length, false); - this.imports.push(entry); - return new RpcImportHook( - /*isPromise=*/ - true, - entry - ); - } - sendStream(id, path, args) { - if (this.abortReason) throw this.abortReason; - let value = ["pipeline", id, path]; - let devalue = Devaluator.devaluate(args.value, void 0, this, args); - value.push(devalue[0]); - let size = this.send(["stream", value]); - let importId = this.imports.length; - let entry = new ImportTableEntry( - this, - importId, - /*pulling=*/ - true - ); - entry.remoteRefcount = 0; - entry.localRefcount = 1; - this.imports.push(entry); - let promise = entry.awaitResolution().then( - (p) => { - p.dispose(); - delete this.imports[importId]; - }, - (err) => { - delete this.imports[importId]; - throw err; - } - ); - return { promise, size }; - } - sendMap(id, path, captures, instructions) { - if (this.abortReason) { - for (let cap of captures) { - cap.dispose(); - } - throw this.abortReason; - } - let devaluedCaptures = captures.map((hook) => { - let importId = this.getImport(hook); - if (importId !== void 0) { - return ["import", importId]; - } else { - return ["export", this.exportStub(hook)]; - } - }); - let value = ["remap", id, path, devaluedCaptures, instructions]; - this.send(["push", value]); - let entry = new ImportTableEntry(this, this.imports.length, false); - this.imports.push(entry); - return new RpcImportHook( - /*isPromise=*/ - true, - entry - ); - } - sendPull(id) { - if (this.abortReason) throw this.abortReason; - this.send(["pull", id]); - } - sendRelease(id, remoteRefcount) { - if (this.abortReason) return; - this.send(["release", id, remoteRefcount]); - delete this.imports[id]; - } - abort(error, trySendAbortMessage = true) { - if (this.abortReason !== void 0) return; - this.cancelReadLoop(error); - if (trySendAbortMessage) { - try { - this.transport.send(JSON.stringify(["abort", Devaluator.devaluate(error, void 0, this)])).catch((err) => { - }); - } catch (err) { - } - } - if (error === void 0) { - error = "undefined"; - } - this.abortReason = error; - if (this.onBatchDone) { - this.onBatchDone.reject(error); - } - if (this.transport.abort) { - try { - this.transport.abort(error); - } catch (err) { - Promise.resolve(err); - } - } - for (let i in this.onBrokenCallbacks) { - try { - this.onBrokenCallbacks[i](error); - } catch (err) { - Promise.resolve(err); - } - } - for (let i in this.imports) { - this.imports[i].abort(error); - } - for (let i in this.exports) { - this.exports[i].hook.dispose(); - } - } - async readLoop(abortPromise) { - while (!this.abortReason) { - let msg = JSON.parse(await Promise.race([this.transport.receive(), abortPromise])); - if (this.abortReason) break; - if (msg instanceof Array) { - switch (msg[0]) { - case "push": - if (msg.length > 1) { - let payload = new Evaluator(this).evaluate(msg[1]); - let hook = new PayloadStubHook(payload); - hook.ignoreUnhandledRejections(); - this.exports.push({ hook, refcount: 1 }); - continue; - } - break; - case "stream": { - if (msg.length > 1) { - let payload = new Evaluator(this).evaluate(msg[1]); - let hook = new PayloadStubHook(payload); - hook.ignoreUnhandledRejections(); - let exportId = this.exports.length; - this.exports.push({ hook, refcount: 1, autoRelease: true }); - this.ensureResolvingExport(exportId); - continue; - } - break; - } - case "pipe": { - let { readable, writable } = new TransformStream(); - let hook = streamImpl.createWritableStreamHook(writable); - this.exports.push({ hook, refcount: 1, pipeReadable: readable }); - continue; - } - case "pull": { - let exportId = msg[1]; - if (typeof exportId == "number") { - this.ensureResolvingExport(exportId); - continue; - } - break; - } - case "resolve": - // ["resolve", ExportId, Expression] - case "reject": { - let importId = msg[1]; - if (typeof importId == "number" && msg.length > 2) { - let imp = this.imports[importId]; - if (imp) { - if (msg[0] == "resolve") { - imp.resolve(new PayloadStubHook(new Evaluator(this).evaluate(msg[2]))); - } else { - let payload = new Evaluator(this).evaluate(msg[2]); - payload.dispose(); - imp.resolve(new ErrorStubHook(payload.value)); - } - } else { - if (msg[0] == "resolve") { - new Evaluator(this).evaluate(msg[2]).dispose(); - } - } - continue; - } - break; - } - case "release": { - let exportId = msg[1]; - let refcount = msg[2]; - if (typeof exportId == "number" && typeof refcount == "number") { - this.releaseExport(exportId, refcount); - continue; - } - break; - } - case "abort": { - let payload = new Evaluator(this).evaluate(msg[1]); - payload.dispose(); - this.abort(payload, false); - break; - } - } - } - throw new Error(`bad RPC message: ${JSON.stringify(msg)}`); - } - } - async drain() { - if (this.abortReason) { - throw this.abortReason; - } - if (this.pullCount > 0) { - let { promise, resolve, reject } = Promise.withResolvers(); - this.onBatchDone = { resolve, reject }; - await promise; - } - } - getStats() { - let result = { imports: 0, exports: 0 }; - for (let i in this.imports) { - ++result.imports; - } - for (let i in this.exports) { - ++result.exports; - } - return result; - } -}; -var RpcSession = class { - static { - __name(this, "RpcSession"); - } - #session; - #mainStub; - constructor(transport, localMain, options = {}) { - let mainHook; - if (localMain) { - mainHook = new PayloadStubHook(RpcPayload.fromAppReturn(localMain)); - } else { - mainHook = new ErrorStubHook(new Error("This connection has no main object.")); - } - this.#session = new RpcSessionImpl(transport, mainHook, options); - this.#mainStub = new RpcStub(this.#session.getMainImport()); - } - getRemoteMain() { - return this.#mainStub; - } - getStats() { - return this.#session.getStats(); - } - drain() { - return this.#session.drain(); - } -}; -function newWebSocketRpcSession(webSocket, localMain, options) { - if (typeof webSocket === "string") { - webSocket = new WebSocket(webSocket); - } - let transport = new WebSocketTransport(webSocket); - let rpc = new RpcSession(transport, localMain, options); - return rpc.getRemoteMain(); -} -__name(newWebSocketRpcSession, "newWebSocketRpcSession"); -function newWorkersWebSocketRpcResponse(request, localMain, options) { - if (request.headers.get("Upgrade")?.toLowerCase() !== "websocket") { - return new Response("This endpoint only accepts WebSocket requests.", { status: 400 }); - } - let pair = new WebSocketPair(); - let server = pair[0]; - server.accept(); - newWebSocketRpcSession(server, localMain, options); - return new Response(null, { - status: 101, - webSocket: pair[1] - }); -} -__name(newWorkersWebSocketRpcResponse, "newWorkersWebSocketRpcResponse"); -var WebSocketTransport = class { - static { - __name(this, "WebSocketTransport"); - } - constructor(webSocket) { - this.#webSocket = webSocket; - if (webSocket.readyState === WebSocket.CONNECTING) { - this.#sendQueue = []; - webSocket.addEventListener("open", (event) => { - try { - for (let message of this.#sendQueue) { - webSocket.send(message); - } - } catch (err) { - this.#receivedError(err); - } - this.#sendQueue = void 0; - }); - } - webSocket.addEventListener("message", (event) => { - if (this.#error) ; - else if (typeof event.data === "string") { - if (this.#receiveResolver) { - this.#receiveResolver(event.data); - this.#receiveResolver = void 0; - this.#receiveRejecter = void 0; - } else { - this.#receiveQueue.push(event.data); - } - } else { - this.#receivedError(new TypeError("Received non-string message from WebSocket.")); - } - }); - webSocket.addEventListener("close", (event) => { - this.#receivedError(new Error(`Peer closed WebSocket: ${event.code} ${event.reason}`)); - }); - webSocket.addEventListener("error", (event) => { - this.#receivedError(new Error(`WebSocket connection failed.`)); - }); - } - #webSocket; - #sendQueue; - // only if not opened yet - #receiveResolver; - #receiveRejecter; - #receiveQueue = []; - #error; - async send(message) { - if (this.#sendQueue === void 0) { - this.#webSocket.send(message); - } else { - this.#sendQueue.push(message); - } - } - async receive() { - if (this.#receiveQueue.length > 0) { - return this.#receiveQueue.shift(); - } else if (this.#error) { - throw this.#error; - } else { - return new Promise((resolve, reject) => { - this.#receiveResolver = resolve; - this.#receiveRejecter = reject; - }); - } - } - abort(reason) { - let message; - if (reason instanceof Error) { - message = reason.message; - } else { - message = `${reason}`; - } - this.#webSocket.close(3e3, message); - if (!this.#error) { - this.#error = reason; - } - } - #receivedError(reason) { - if (!this.#error) { - this.#error = reason; - if (this.#receiveRejecter) { - this.#receiveRejecter(reason); - this.#receiveResolver = void 0; - this.#receiveRejecter = void 0; - } - } - } -}; -var BatchServerTransport = class { - static { - __name(this, "BatchServerTransport"); - } - constructor(batch) { - this.#batchToReceive = batch; - } - #batchToSend = []; - #batchToReceive; - #allReceived = Promise.withResolvers(); - async send(message) { - this.#batchToSend.push(message); - } - async receive() { - let msg = this.#batchToReceive.shift(); - if (msg !== void 0) { - return msg; - } else { - this.#allReceived.resolve(); - return new Promise((r) => { - }); - } - } - abort(reason) { - this.#allReceived.reject(reason); - } - whenAllReceived() { - return this.#allReceived.promise; - } - getResponseBody() { - return this.#batchToSend.join("\n"); - } -}; -async function newHttpBatchRpcResponse(request, localMain, options) { - if (request.method !== "POST") { - return new Response("This endpoint only accepts POST requests.", { status: 405 }); - } - let body = await request.text(); - let batch = body === "" ? [] : body.split("\n"); - let transport = new BatchServerTransport(batch); - let rpc = new RpcSession(transport, localMain, options); - await transport.whenAllReceived(); - await rpc.drain(); - return new Response(transport.getResponseBody()); -} -__name(newHttpBatchRpcResponse, "newHttpBatchRpcResponse"); -var currentMapBuilder; -var MapBuilder = class { - static { - __name(this, "MapBuilder"); - } - context; - captureMap = /* @__PURE__ */ new Map(); - instructions = []; - constructor(subject, path) { - if (currentMapBuilder) { - this.context = { - parent: currentMapBuilder, - captures: [], - subject: currentMapBuilder.capture(subject), - path - }; - } else { - this.context = { - parent: void 0, - captures: [], - subject, - path - }; - } - currentMapBuilder = this; - } - unregister() { - currentMapBuilder = this.context.parent; - } - makeInput() { - return new MapVariableHook(this, 0); - } - makeOutput(result) { - let devalued; - try { - devalued = Devaluator.devaluate(result.value, void 0, this, result); - } finally { - result.dispose(); - } - this.instructions.push(devalued); - if (this.context.parent) { - this.context.parent.instructions.push( - [ - "remap", - this.context.subject, - this.context.path, - this.context.captures.map((cap) => ["import", cap]), - this.instructions - ] - ); - return new MapVariableHook(this.context.parent, this.context.parent.instructions.length); - } else { - return this.context.subject.map(this.context.path, this.context.captures, this.instructions); - } - } - pushCall(hook, path, params) { - let devalued = Devaluator.devaluate(params.value, void 0, this, params); - devalued = devalued[0]; - let subject = this.capture(hook.dup()); - this.instructions.push(["pipeline", subject, path, devalued]); - return new MapVariableHook(this, this.instructions.length); - } - pushGet(hook, path) { - let subject = this.capture(hook.dup()); - this.instructions.push(["pipeline", subject, path]); - return new MapVariableHook(this, this.instructions.length); - } - capture(hook) { - if (hook instanceof MapVariableHook && hook.mapper === this) { - return hook.idx; - } - let result = this.captureMap.get(hook); - if (result === void 0) { - if (this.context.parent) { - let parentIdx = this.context.parent.capture(hook); - this.context.captures.push(parentIdx); - } else { - this.context.captures.push(hook); - } - result = -this.context.captures.length; - this.captureMap.set(hook, result); - } - return result; - } - // --------------------------------------------------------------------------- - // implements Exporter - exportStub(hook) { - throw new Error( - "Can't construct an RpcTarget or RPC callback inside a mapper function. Try creating a new RpcStub outside the callback first, then using it inside the callback." - ); - } - exportPromise(hook) { - return this.exportStub(hook); - } - getImport(hook) { - return this.capture(hook); - } - unexport(ids) { - } - createPipe(readable) { - throw new Error("Cannot send ReadableStream inside a mapper function."); - } - onSendError(error) { - } -}; -mapImpl.sendMap = (hook, path, func) => { - let builder = new MapBuilder(hook, path); - let result; - try { - result = RpcPayload.fromAppReturn(withCallInterceptor(builder.pushCall.bind(builder), () => { - return func(new RpcPromise(builder.makeInput(), [])); - })); - } finally { - builder.unregister(); - } - if (result instanceof Promise) { - result.catch((err) => { - }); - throw new Error("RPC map() callbacks cannot be async."); - } - return new RpcPromise(builder.makeOutput(result), []); -}; -function throwMapperBuilderUseError() { - throw new Error( - "Attempted to use an abstract placeholder from a mapper function. Please make sure your map function has no side effects." - ); -} -__name(throwMapperBuilderUseError, "throwMapperBuilderUseError"); -var MapVariableHook = class extends StubHook { - static { - __name(this, "MapVariableHook"); - } - constructor(mapper, idx) { - super(); - this.mapper = mapper; - this.idx = idx; - } - // We don't have anything we actually need to dispose, so dup() can just return the same hook. - dup() { - return this; - } - dispose() { - } - get(path) { - if (path.length == 0) { - return this; - } else if (currentMapBuilder) { - return currentMapBuilder.pushGet(this, path); - } else { - throwMapperBuilderUseError(); - } - } - // Other methods should never be called. - call(path, args) { - throwMapperBuilderUseError(); - } - map(path, captures, instructions) { - throwMapperBuilderUseError(); - } - pull() { - throwMapperBuilderUseError(); - } - ignoreUnhandledRejections() { - } - onBroken(callback) { - throwMapperBuilderUseError(); - } -}; -var MapApplicator = class { - static { - __name(this, "MapApplicator"); - } - constructor(captures, input) { - this.captures = captures; - this.variables = [input]; - } - variables; - dispose() { - for (let variable of this.variables) { - variable.dispose(); - } - } - apply(instructions) { - try { - if (instructions.length < 1) { - throw new Error("Invalid empty mapper function."); - } - for (let instruction of instructions.slice(0, -1)) { - let payload = new Evaluator(this).evaluateCopy(instruction); - if (payload.value instanceof RpcStub) { - let hook = unwrapStubNoProperties(payload.value); - if (hook) { - this.variables.push(hook); - continue; - } - } - this.variables.push(new PayloadStubHook(payload)); - } - return new Evaluator(this).evaluateCopy(instructions[instructions.length - 1]); - } finally { - for (let variable of this.variables) { - variable.dispose(); - } - } - } - importStub(idx) { - throw new Error("A mapper function cannot refer to exports."); - } - importPromise(idx) { - return this.importStub(idx); - } - getExport(idx) { - if (idx < 0) { - return this.captures[-idx - 1]; - } else { - return this.variables[idx]; - } - } - getPipeReadable(exportId) { - throw new Error("A mapper function cannot use pipe readables."); - } -}; -function applyMapToElement(input, parent, owner, captures, instructions) { - let inputHook = new PayloadStubHook(RpcPayload.deepCopyFrom(input, parent, owner)); - let mapper = new MapApplicator(captures, inputHook); - try { - return mapper.apply(instructions); - } finally { - mapper.dispose(); - } -} -__name(applyMapToElement, "applyMapToElement"); -mapImpl.applyMap = (input, parent, owner, captures, instructions) => { - try { - let result; - if (input instanceof RpcPromise) { - throw new Error("applyMap() can't be called on RpcPromise"); - } else if (input instanceof Array) { - let payloads = []; - try { - for (let elem of input) { - payloads.push(applyMapToElement(elem, input, owner, captures, instructions)); - } - } catch (err) { - for (let payload of payloads) { - payload.dispose(); - } - throw err; - } - result = RpcPayload.fromArray(payloads); - } else if (input === null || input === void 0) { - result = RpcPayload.fromAppReturn(input); - } else { - result = applyMapToElement(input, parent, owner, captures, instructions); - } - return new PayloadStubHook(result); - } finally { - for (let cap of captures) { - cap.dispose(); - } - } -}; -var WritableStreamStubHook = class _WritableStreamStubHook extends StubHook { - static { - __name(this, "_WritableStreamStubHook"); - } - state; - // undefined when disposed - // Creates a new WritableStreamStubHook that is not duplicated from an existing hook. - static create(stream) { - let writer = stream.getWriter(); - return new _WritableStreamStubHook({ refcount: 1, writer, closed: false }); - } - constructor(state, dupFrom) { - super(); - this.state = state; - if (dupFrom) { - ++state.refcount; - } - } - getState() { - if (this.state) { - return this.state; - } else { - throw new Error("Attempted to use a WritableStreamStubHook after it was disposed."); - } - } - call(path, args) { - try { - let state = this.getState(); - if (path.length !== 1 || typeof path[0] !== "string") { - throw new Error("WritableStream stub only supports direct method calls"); - } - const method = path[0]; - if (method !== "write" && method !== "close" && method !== "abort") { - args.dispose(); - throw new Error(`Unknown WritableStream method: ${method}`); - } - if (method === "close" || method === "abort") { - state.closed = true; - } - let func = state.writer[method]; - let promise = args.deliverCall(func, state.writer); - return new PromiseStubHook(promise.then((payload) => new PayloadStubHook(payload))); - } catch (err) { - return new ErrorStubHook(err); - } - } - map(path, captures, instructions) { - for (let cap of captures) { - cap.dispose(); - } - return new ErrorStubHook(new Error("Cannot use map() on a WritableStream")); - } - get(path) { - return new ErrorStubHook(new Error("Cannot access properties on a WritableStream stub")); - } - dup() { - let state = this.getState(); - return new _WritableStreamStubHook(state, this); - } - pull() { - return Promise.reject(new Error("Cannot pull a WritableStream stub")); - } - ignoreUnhandledRejections() { - } - dispose() { - let state = this.state; - this.state = void 0; - if (state) { - if (--state.refcount === 0) { - if (!state.closed) { - state.writer.abort(new Error("WritableStream RPC stub was disposed without calling close()")).catch(() => { - }); - } - state.writer.releaseLock(); - } - } - } - onBroken(callback) { - } -}; -var INITIAL_WINDOW = 256 * 1024; -var MAX_WINDOW = 1024 * 1024 * 1024; -var MIN_WINDOW = 64 * 1024; -var STARTUP_GROWTH_FACTOR = 2; -var STEADY_GROWTH_FACTOR = 1.25; -var DECAY_FACTOR = 0.9; -var STARTUP_EXIT_ROUNDS = 3; -var FlowController = class { - static { - __name(this, "FlowController"); - } - constructor(now) { - this.now = now; - } - // The current window size in bytes. The sender blocks when bytesInFlight >= window. - window = INITIAL_WINDOW; - // Total bytes currently in flight (sent but not yet acked). - bytesInFlight = 0; - // Whether we're still in the startup phase. - inStartupPhase = true; - // ----- BDP estimation state (private) ----- - // Total bytes acked so far. - delivered = 0; - // Time of most recent ack. - deliveredTime = 0; - // Time when the very first ack was received. - firstAckTime = 0; - firstAckDelivered = 0; - // Global minimum RTT observed (milliseconds). - minRtt = Infinity; - // For startup exit: count of consecutive RTT rounds where the window didn't meaningfully grow. - roundsWithoutIncrease = 0; - // Window size at the start of the current round, for startup exit detection. - lastRoundWindow = 0; - // Time when the current round started. - roundStartTime = 0; - // Called when a write of `size` bytes is about to be sent. Returns a token that must be - // passed to onAck() when the ack arrives, and whether the sender should block (window full). - onSend(size) { - this.bytesInFlight += size; - let token = { - sentTime: this.now(), - size, - deliveredAtSend: this.delivered, - deliveredTimeAtSend: this.deliveredTime, - windowAtSend: this.window, - windowFullAtSend: this.bytesInFlight >= this.window - }; - return { token, shouldBlock: token.windowFullAtSend }; - } - // Called when a previously-sent write fails. Restores bytesInFlight without updating - // any BDP estimates. - onError(token) { - this.bytesInFlight -= token.size; - } - // Called when an ack is received for a previously-sent write. Updates BDP estimates and - // the window. Returns whether a blocked sender should now unblock. - onAck(token) { - let ackTime = this.now(); - this.delivered += token.size; - this.deliveredTime = ackTime; - this.bytesInFlight -= token.size; - let rtt = ackTime - token.sentTime; - this.minRtt = Math.min(this.minRtt, rtt); - if (this.firstAckTime === 0) { - this.firstAckTime = ackTime; - this.firstAckDelivered = this.delivered; - } else { - let baseTime; - let baseDelivered; - if (token.deliveredTimeAtSend === 0) { - baseTime = this.firstAckTime; - baseDelivered = this.firstAckDelivered; - } else { - baseTime = token.deliveredTimeAtSend; - baseDelivered = token.deliveredAtSend; - } - let interval = ackTime - baseTime; - let bytes = this.delivered - baseDelivered; - let bandwidth = bytes / interval; - let growthFactor = this.inStartupPhase ? STARTUP_GROWTH_FACTOR : STEADY_GROWTH_FACTOR; - let newWindow = bandwidth * this.minRtt * growthFactor; - newWindow = Math.min(newWindow, token.windowAtSend * growthFactor); - if (token.windowFullAtSend) { - newWindow = Math.max(newWindow, token.windowAtSend * DECAY_FACTOR); - } else { - newWindow = Math.max(newWindow, this.window); - } - this.window = Math.max(Math.min(newWindow, MAX_WINDOW), MIN_WINDOW); - if (this.inStartupPhase && token.sentTime >= this.roundStartTime) { - if (this.window > this.lastRoundWindow * STEADY_GROWTH_FACTOR) { - this.roundsWithoutIncrease = 0; - } else { - if (++this.roundsWithoutIncrease >= STARTUP_EXIT_ROUNDS) { - this.inStartupPhase = false; - } - } - this.roundStartTime = ackTime; - this.lastRoundWindow = this.window; - } - } - return this.bytesInFlight < this.window; - } -}; -function createWritableStreamFromHook(hook) { - let pendingError = void 0; - let hookDisposed = false; - let fc = new FlowController(() => performance.now()); - let windowResolve; - let windowReject; - const disposeHook = /* @__PURE__ */ __name(() => { - if (!hookDisposed) { - hookDisposed = true; - hook.dispose(); - } - }, "disposeHook"); - return new WritableStream({ - write(chunk, controller) { - if (pendingError !== void 0) { - throw pendingError; - } - const payload = RpcPayload.fromAppParams([chunk]); - const { promise, size } = hook.stream(["write"], payload); - if (size === void 0) { - return promise.catch((err) => { - if (pendingError === void 0) { - pendingError = err; - } - throw err; - }); - } else { - let { token, shouldBlock } = fc.onSend(size); - promise.then(() => { - let hasCapacity = fc.onAck(token); - if (hasCapacity && windowResolve) { - windowResolve(); - windowResolve = void 0; - windowReject = void 0; - } - }, (err) => { - fc.onError(token); - if (pendingError === void 0) { - pendingError = err; - controller.error(err); - disposeHook(); - } - if (windowReject) { - windowReject(err); - windowResolve = void 0; - windowReject = void 0; - } - }); - if (shouldBlock) { - return new Promise((resolve, reject) => { - windowResolve = resolve; - windowReject = reject; - }); - } - } - }, - async close() { - if (pendingError !== void 0) { - disposeHook(); - throw pendingError; - } - const { promise } = hook.stream(["close"], RpcPayload.fromAppParams([])); - try { - await promise; - } catch (err) { - throw pendingError ?? err; - } finally { - disposeHook(); - } - }, - abort(reason) { - if (pendingError !== void 0) { - return; - } - pendingError = reason ?? new Error("WritableStream was aborted"); - if (windowReject) { - windowReject(pendingError); - windowResolve = void 0; - windowReject = void 0; - } - const { promise } = hook.stream(["abort"], RpcPayload.fromAppParams([reason])); - promise.then(() => disposeHook(), () => disposeHook()); - } - }); -} -__name(createWritableStreamFromHook, "createWritableStreamFromHook"); -var ReadableStreamStubHook = class _ReadableStreamStubHook extends StubHook { - static { - __name(this, "_ReadableStreamStubHook"); - } - state; - // undefined when disposed - // Creates a new ReadableStreamStubHook. - static create(stream) { - return new _ReadableStreamStubHook({ refcount: 1, stream, canceled: false }); - } - constructor(state, dupFrom) { - super(); - this.state = state; - if (dupFrom) { - ++state.refcount; - } - } - call(path, args) { - args.dispose(); - return new ErrorStubHook(new Error("Cannot call methods on a ReadableStream stub")); - } - map(path, captures, instructions) { - for (let cap of captures) { - cap.dispose(); - } - return new ErrorStubHook(new Error("Cannot use map() on a ReadableStream")); - } - get(path) { - return new ErrorStubHook(new Error("Cannot access properties on a ReadableStream stub")); - } - dup() { - let state = this.state; - if (!state) { - throw new Error("Attempted to dup a ReadableStreamStubHook after it was disposed."); - } - return new _ReadableStreamStubHook(state, this); - } - pull() { - return Promise.reject(new Error("Cannot pull a ReadableStream stub")); - } - ignoreUnhandledRejections() { - } - dispose() { - let state = this.state; - this.state = void 0; - if (state) { - if (--state.refcount === 0) { - if (!state.canceled) { - state.canceled = true; - if (!state.stream.locked) { - state.stream.cancel( - new Error("ReadableStream RPC stub was disposed without being consumed") - ).catch(() => { - }); - } - } - } - } - } - onBroken(callback) { - } -}; -streamImpl.createWritableStreamHook = WritableStreamStubHook.create; -streamImpl.createWritableStreamFromHook = createWritableStreamFromHook; -streamImpl.createReadableStreamHook = ReadableStreamStubHook.create; -async function newWorkersRpcResponse(request, localMain) { - if (request.method === "POST") { - let response = await newHttpBatchRpcResponse(request, localMain); - response.headers.set("Access-Control-Allow-Origin", "*"); - return response; - } else if (request.headers.get("Upgrade")?.toLowerCase() === "websocket") { - return newWorkersWebSocketRpcResponse(request, localMain); - } else { - return new Response("This endpoint only accepts POST or WebSocket requests.", { status: 400 }); - } -} -__name(newWorkersRpcResponse, "newWorkersRpcResponse"); -var BindingNotFoundError = class extends Error { - static { - __name(this, "BindingNotFoundError"); - } - constructor(name) { - super(`Binding ${name ? `"${name}"` : ""} not found`); - } -}; -function getExposedJSRPCBinding(request, env) { - const url = new URL(request.url); - const bindingName = url.searchParams.get("MF-Binding"); - if (!bindingName) { - throw new BindingNotFoundError(); - } - const targetBinding = env[bindingName]; - if (!targetBinding) { - throw new BindingNotFoundError(bindingName); - } - if (targetBinding.constructor.name === "SendEmail") { - return { - async send(e) { - if ("EmailMessage::raw" in e) { - const message = new EmailMessage( - e.from, - e.to, - e["EmailMessage::raw"] - ); - return targetBinding.send(message); - } else { - return targetBinding.send(e); - } - } - }; - } - if (url.searchParams.has("MF-Dispatch-Namespace-Options")) { - const { name, args, options } = JSON.parse( - url.searchParams.get("MF-Dispatch-Namespace-Options") - ); - return targetBinding.get(name, args, options); - } - return targetBinding; -} -__name(getExposedJSRPCBinding, "getExposedJSRPCBinding"); -function getExposedFetcher(request, env) { - const bindingName = request.headers.get("MF-Binding"); - if (!bindingName) { - throw new BindingNotFoundError(); - } - const targetBinding = env[bindingName]; - if (!targetBinding) { - throw new BindingNotFoundError(bindingName); - } - const dispatchNamespaceOptions = request.headers.get( - "MF-Dispatch-Namespace-Options" - ); - if (dispatchNamespaceOptions) { - const { name, args, options } = JSON.parse(dispatchNamespaceOptions); - return targetBinding.get(name, args, options); - } - return targetBinding; -} -__name(getExposedFetcher, "getExposedFetcher"); -function isJSRPCBinding(request) { - const url = new URL(request.url); - return request.headers.has("Upgrade") && url.searchParams.has("MF-Binding"); -} -__name(isJSRPCBinding, "isJSRPCBinding"); -var ProxyServerWorker_default = { - async fetch(request, env) { - try { - if (isJSRPCBinding(request)) { - return newWorkersRpcResponse( - request, - getExposedJSRPCBinding(request, env) - ); - } else { - const fetcher = getExposedFetcher(request, env); - const originalHeaders = new Headers(); - for (const [name, value] of request.headers) { - if (name.startsWith("mf-header-")) { - originalHeaders.set(name.slice("mf-header-".length), value); - } else if (name === "upgrade") { - originalHeaders.set(name, value); - } - } - return fetcher.fetch( - request.headers.get("MF-URL") ?? "http://example.com", - new Request(request, { - redirect: "manual", - headers: originalHeaders - }) - ); - } - } catch (e) { - if (e instanceof BindingNotFoundError) { - return new Response(e.message, { status: 400 }); - } - return new Response(e.message, { status: 500 }); - } - } -}; - -// node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts -var drainBody = /* @__PURE__ */ __name(async (request, env, _ctx, middlewareCtx) => { - try { - return await middlewareCtx.next(request, env); - } finally { - try { - if (request.body !== null && !request.bodyUsed) { - const reader = request.body.getReader(); - while (!(await reader.read()).done) { - } - } - } catch (e) { - console.error("Failed to drain the unused request body.", e); - } - } -}, "drainBody"); -var middleware_ensure_req_body_drained_default = drainBody; - -// .wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js -var __INTERNAL_WRANGLER_MIDDLEWARE__ = [ - middleware_ensure_req_body_drained_default -]; -var middleware_insertion_facade_default = ProxyServerWorker_default; - -// node_modules/wrangler/templates/middleware/common.ts -var __facade_middleware__ = []; -function __facade_register__(...args) { - __facade_middleware__.push(...args.flat()); -} -__name(__facade_register__, "__facade_register__"); -function __facade_invokeChain__(request, env, ctx, dispatch, middlewareChain) { - const [head, ...tail] = middlewareChain; - const middlewareCtx = { - dispatch, - next(newRequest, newEnv) { - return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail); - } - }; - return head(request, env, ctx, middlewareCtx); -} -__name(__facade_invokeChain__, "__facade_invokeChain__"); -function __facade_invoke__(request, env, ctx, dispatch, finalMiddleware) { - return __facade_invokeChain__(request, env, ctx, dispatch, [ - ...__facade_middleware__, - finalMiddleware - ]); -} -__name(__facade_invoke__, "__facade_invoke__"); - -// .wrangler/tmp/bundle-lfsPwi/middleware-loader.entry.ts -var __Facade_ScheduledController__ = class ___Facade_ScheduledController__ { - constructor(scheduledTime, cron, noRetry) { - this.scheduledTime = scheduledTime; - this.cron = cron; - this.#noRetry = noRetry; - } - static { - __name(this, "__Facade_ScheduledController__"); - } - #noRetry; - noRetry() { - if (!(this instanceof ___Facade_ScheduledController__)) { - throw new TypeError("Illegal invocation"); - } - this.#noRetry(); - } -}; -function wrapExportedHandler(worker) { - if (__INTERNAL_WRANGLER_MIDDLEWARE__ === void 0 || __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0) { - return worker; - } - for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { - __facade_register__(middleware); - } - const fetchDispatcher = /* @__PURE__ */ __name(function(request, env, ctx) { - if (worker.fetch === void 0) { - throw new Error("Handler does not export a fetch() function."); - } - return worker.fetch(request, env, ctx); - }, "fetchDispatcher"); - return { - ...worker, - fetch(request, env, ctx) { - const dispatcher = /* @__PURE__ */ __name(function(type, init) { - if (type === "scheduled" && worker.scheduled !== void 0) { - const controller = new __Facade_ScheduledController__( - Date.now(), - init.cron ?? "", - () => { - } - ); - return worker.scheduled(controller, env, ctx); - } - }, "dispatcher"); - return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher); - } - }; -} -__name(wrapExportedHandler, "wrapExportedHandler"); -function wrapWorkerEntrypoint(klass) { - if (__INTERNAL_WRANGLER_MIDDLEWARE__ === void 0 || __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0) { - return klass; - } - for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { - __facade_register__(middleware); - } - return class extends klass { - #fetchDispatcher = /* @__PURE__ */ __name((request, env, ctx) => { - this.env = env; - this.ctx = ctx; - if (super.fetch === void 0) { - throw new Error("Entrypoint class does not define a fetch() function."); - } - return super.fetch(request); - }, "#fetchDispatcher"); - #dispatcher = /* @__PURE__ */ __name((type, init) => { - if (type === "scheduled" && super.scheduled !== void 0) { - const controller = new __Facade_ScheduledController__( - Date.now(), - init.cron ?? "", - () => { - } - ); - return super.scheduled(controller); - } - }, "#dispatcher"); - fetch(request) { - return __facade_invoke__( - request, - this.env, - this.ctx, - this.#dispatcher, - this.#fetchDispatcher - ); - } - }; -} -__name(wrapWorkerEntrypoint, "wrapWorkerEntrypoint"); -var WRAPPED_ENTRY; -if (typeof middleware_insertion_facade_default === "object") { - WRAPPED_ENTRY = wrapExportedHandler(middleware_insertion_facade_default); -} else if (typeof middleware_insertion_facade_default === "function") { - WRAPPED_ENTRY = wrapWorkerEntrypoint(middleware_insertion_facade_default); -} -var middleware_loader_entry_default = WRAPPED_ENTRY; -export { - __INTERNAL_WRANGLER_MIDDLEWARE__, - middleware_loader_entry_default as default -}; -//# sourceMappingURL=ProxyServerWorker.js.map diff --git a/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js.map b/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js.map deleted file mode 100644 index 8b29a49..0000000 --- a/.wrangler/tmp/dev-ePVlVV/ProxyServerWorker.js.map +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 3, - "sources": ["../../../node_modules/wrangler/wrangler-dist/ProxyServerWorker.js", "../../../node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts", "../bundle-lfsPwi/middleware-insertion-facade.js", "../../../node_modules/wrangler/templates/middleware/common.ts", "../bundle-lfsPwi/middleware-loader.entry.ts"], - "sourceRoot": "/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/dev-ePVlVV", - "sourcesContent": ["// ../../node_modules/.pnpm/capnweb@0.5.0/node_modules/capnweb/dist/index-workers.js\nimport * as cfw from \"cloudflare:workers\";\nvar WORKERS_MODULE_SYMBOL = /* @__PURE__ */ Symbol(\"workers-module\");\nglobalThis[WORKERS_MODULE_SYMBOL] = cfw;\nif (!Symbol.dispose) {\n Symbol.dispose = /* @__PURE__ */ Symbol.for(\"dispose\");\n}\nif (!Symbol.asyncDispose) {\n Symbol.asyncDispose = /* @__PURE__ */ Symbol.for(\"asyncDispose\");\n}\nif (!Promise.withResolvers) {\n Promise.withResolvers = function() {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n };\n}\nvar workersModule = globalThis[WORKERS_MODULE_SYMBOL];\nvar RpcTarget = workersModule ? workersModule.RpcTarget : class {\n};\nvar AsyncFunction = (async function() {\n}).constructor;\nfunction typeForRpc(value) {\n switch (typeof value) {\n case \"boolean\":\n case \"number\":\n case \"string\":\n return \"primitive\";\n case \"undefined\":\n return \"undefined\";\n case \"object\":\n case \"function\":\n break;\n case \"bigint\":\n return \"bigint\";\n default:\n return \"unsupported\";\n }\n if (value === null) {\n return \"primitive\";\n }\n let prototype = Object.getPrototypeOf(value);\n switch (prototype) {\n case Object.prototype:\n return \"object\";\n case Function.prototype:\n case AsyncFunction.prototype:\n return \"function\";\n case Array.prototype:\n return \"array\";\n case Date.prototype:\n return \"date\";\n case Uint8Array.prototype:\n return \"bytes\";\n case WritableStream.prototype:\n return \"writable\";\n case ReadableStream.prototype:\n return \"readable\";\n case Headers.prototype:\n return \"headers\";\n case Request.prototype:\n return \"request\";\n case Response.prototype:\n return \"response\";\n // TODO: All other structured clone types.\n case RpcStub.prototype:\n return \"stub\";\n case RpcPromise.prototype:\n return \"rpc-promise\";\n // TODO: Promise or thenable\n default:\n if (workersModule) {\n if (prototype == workersModule.RpcStub.prototype || value instanceof workersModule.ServiceStub) {\n return \"rpc-target\";\n } else if (prototype == workersModule.RpcPromise.prototype || prototype == workersModule.RpcProperty.prototype) {\n return \"rpc-thenable\";\n }\n }\n if (value instanceof RpcTarget) {\n return \"rpc-target\";\n }\n if (value instanceof Error) {\n return \"error\";\n }\n return \"unsupported\";\n }\n}\nfunction mapNotLoaded() {\n throw new Error(\"RPC map() implementation was not loaded.\");\n}\nvar mapImpl = { applyMap: mapNotLoaded, sendMap: mapNotLoaded };\nfunction streamNotLoaded() {\n throw new Error(\"Stream implementation was not loaded.\");\n}\nvar streamImpl = {\n createWritableStreamHook: streamNotLoaded,\n createWritableStreamFromHook: streamNotLoaded,\n createReadableStreamHook: streamNotLoaded\n};\nvar StubHook = class {\n // Like call(), but designed for streaming calls (e.g. WritableStream writes). Returns:\n // - promise: A Promise for the completion of the call.\n // - size: If the call was remote, the byte size of the serialized message. For local calls,\n // undefined is returned, indicating the caller should await the promise to serialize writes\n // (no overlapping).\n stream(path, args) {\n let hook = this.call(path, args);\n let pulled = hook.pull();\n let promise;\n if (pulled instanceof Promise) {\n promise = pulled.then((p) => {\n p.dispose();\n });\n } else {\n pulled.dispose();\n promise = Promise.resolve();\n }\n return { promise };\n }\n};\nvar ErrorStubHook = class extends StubHook {\n constructor(error) {\n super();\n this.error = error;\n }\n call(path, args) {\n return this;\n }\n map(path, captures, instructions) {\n return this;\n }\n get(path) {\n return this;\n }\n dup() {\n return this;\n }\n pull() {\n return Promise.reject(this.error);\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n }\n onBroken(callback) {\n try {\n callback(this.error);\n } catch (err) {\n Promise.resolve(err);\n }\n }\n};\nvar DISPOSED_HOOK = new ErrorStubHook(\n new Error(\"Attempted to use RPC stub after it has been disposed.\")\n);\nvar doCall = (hook, path, params) => {\n return hook.call(path, params);\n};\nfunction withCallInterceptor(interceptor, callback) {\n let oldValue = doCall;\n doCall = interceptor;\n try {\n return callback();\n } finally {\n doCall = oldValue;\n }\n}\nvar RAW_STUB = /* @__PURE__ */ Symbol(\"realStub\");\nvar PROXY_HANDLERS = {\n apply(target, thisArg, argumentsList) {\n let stub = target.raw;\n return new RpcPromise(doCall(\n stub.hook,\n stub.pathIfPromise || [],\n RpcPayload.fromAppParams(argumentsList)\n ), []);\n },\n get(target, prop, receiver) {\n let stub = target.raw;\n if (prop === RAW_STUB) {\n return stub;\n } else if (prop in RpcPromise.prototype) {\n return stub[prop];\n } else if (typeof prop === \"string\") {\n return new RpcPromise(\n stub.hook,\n stub.pathIfPromise ? [...stub.pathIfPromise, prop] : [prop]\n );\n } else if (prop === Symbol.dispose && (!stub.pathIfPromise || stub.pathIfPromise.length == 0)) {\n return () => {\n stub.hook.dispose();\n stub.hook = DISPOSED_HOOK;\n };\n } else {\n return void 0;\n }\n },\n has(target, prop) {\n let stub = target.raw;\n if (prop === RAW_STUB) {\n return true;\n } else if (prop in RpcPromise.prototype) {\n return prop in stub;\n } else if (typeof prop === \"string\") {\n return true;\n } else if (prop === Symbol.dispose && (!stub.pathIfPromise || stub.pathIfPromise.length == 0)) {\n return true;\n } else {\n return false;\n }\n },\n construct(target, args) {\n throw new Error(\"An RPC stub cannot be used as a constructor.\");\n },\n defineProperty(target, property, attributes) {\n throw new Error(\"Can't define properties on RPC stubs.\");\n },\n deleteProperty(target, p) {\n throw new Error(\"Can't delete properties on RPC stubs.\");\n },\n getOwnPropertyDescriptor(target, p) {\n return void 0;\n },\n getPrototypeOf(target) {\n return Object.getPrototypeOf(target.raw);\n },\n isExtensible(target) {\n return false;\n },\n ownKeys(target) {\n return [];\n },\n preventExtensions(target) {\n return true;\n },\n set(target, p, newValue, receiver) {\n throw new Error(\"Can't assign properties on RPC stubs.\");\n },\n setPrototypeOf(target, v) {\n throw new Error(\"Can't override prototype of RPC stubs.\");\n }\n};\nvar RpcStub = class _RpcStub extends RpcTarget {\n // Although `hook` and `path` are declared `public` here, they are effectively hidden by the\n // proxy.\n constructor(hook, pathIfPromise) {\n super();\n if (!(hook instanceof StubHook)) {\n let value = hook;\n if (value instanceof RpcTarget || value instanceof Function) {\n hook = TargetStubHook.create(value, void 0);\n } else {\n hook = new PayloadStubHook(RpcPayload.fromAppReturn(value));\n }\n if (pathIfPromise) {\n throw new TypeError(\"RpcStub constructor expected one argument, received two.\");\n }\n }\n this.hook = hook;\n this.pathIfPromise = pathIfPromise;\n let func = () => {\n };\n func.raw = this;\n return new Proxy(func, PROXY_HANDLERS);\n }\n hook;\n pathIfPromise;\n dup() {\n let target = this[RAW_STUB];\n if (target.pathIfPromise) {\n return new _RpcStub(target.hook.get(target.pathIfPromise));\n } else {\n return new _RpcStub(target.hook.dup());\n }\n }\n onRpcBroken(callback) {\n this[RAW_STUB].hook.onBroken(callback);\n }\n map(func) {\n let { hook, pathIfPromise } = this[RAW_STUB];\n return mapImpl.sendMap(hook, pathIfPromise || [], func);\n }\n toString() {\n return \"[object RpcStub]\";\n }\n};\nvar RpcPromise = class extends RpcStub {\n // TODO: Support passing target value or promise to constructor.\n constructor(hook, pathIfPromise) {\n super(hook, pathIfPromise);\n }\n then(onfulfilled, onrejected) {\n return pullPromise(this).then(...arguments);\n }\n catch(onrejected) {\n return pullPromise(this).catch(...arguments);\n }\n finally(onfinally) {\n return pullPromise(this).finally(...arguments);\n }\n toString() {\n return \"[object RpcPromise]\";\n }\n};\nfunction unwrapStubTakingOwnership(stub) {\n let { hook, pathIfPromise } = stub[RAW_STUB];\n if (pathIfPromise && pathIfPromise.length > 0) {\n return hook.get(pathIfPromise);\n } else {\n return hook;\n }\n}\nfunction unwrapStubAndDup(stub) {\n let { hook, pathIfPromise } = stub[RAW_STUB];\n if (pathIfPromise) {\n return hook.get(pathIfPromise);\n } else {\n return hook.dup();\n }\n}\nfunction unwrapStubNoProperties(stub) {\n let { hook, pathIfPromise } = stub[RAW_STUB];\n if (pathIfPromise && pathIfPromise.length > 0) {\n return void 0;\n }\n return hook;\n}\nfunction unwrapStubOrParent(stub) {\n return stub[RAW_STUB].hook;\n}\nfunction unwrapStubAndPath(stub) {\n return stub[RAW_STUB];\n}\nasync function pullPromise(promise) {\n let { hook, pathIfPromise } = promise[RAW_STUB];\n if (pathIfPromise.length > 0) {\n hook = hook.get(pathIfPromise);\n }\n let payload = await hook.pull();\n return payload.deliverResolve();\n}\nvar RpcPayload = class _RpcPayload {\n // Private constructor; use factory functions above to construct.\n constructor(value, source, hooks, promises) {\n this.value = value;\n this.source = source;\n this.hooks = hooks;\n this.promises = promises;\n }\n // Create a payload from a value passed as params to an RPC from the app.\n //\n // The payload does NOT take ownership of any stubs in `value`, and but promises not to modify\n // `value`. If the payload is delivered locally, `value` will be deep-copied first, so as not\n // to have the sender and recipient end up sharing the same mutable object. `value` will not be\n // touched again after the call returns synchronously (returns a promise) -- by that point,\n // the value has either been copied or serialized to the wire.\n static fromAppParams(value) {\n return new _RpcPayload(value, \"params\");\n }\n // Create a payload from a value return from an RPC implementation by the app.\n //\n // Unlike fromAppParams(), in this case the payload takes ownership of all stubs in `value`, and\n // may hold onto `value` for an arbitrarily long time (e.g. to serve pipelined requests). It\n // will still avoid modifying `value` and will make a deep copy if it is delivered locally.\n static fromAppReturn(value) {\n return new _RpcPayload(value, \"return\");\n }\n // Combine an array of payloads into a single payload whose value is an array. Ownership of all\n // stubs is transferred from the inputs to the outputs, hence if the output is disposed, the\n // inputs should not be. (In case of exception, nothing is disposed, though.)\n static fromArray(array) {\n let hooks = [];\n let promises = [];\n let resultArray = [];\n for (let payload of array) {\n payload.ensureDeepCopied();\n for (let hook of payload.hooks) {\n hooks.push(hook);\n }\n for (let promise of payload.promises) {\n if (promise.parent === payload) {\n promise = {\n parent: resultArray,\n property: resultArray.length,\n promise: promise.promise\n };\n }\n promises.push(promise);\n }\n resultArray.push(payload.value);\n }\n return new _RpcPayload(resultArray, \"owned\", hooks, promises);\n }\n // Create a payload from a value parsed off the wire using Evaluator.evaluate().\n //\n // A payload is constructed with a null value and the given hooks and promises arrays. The value\n // is expected to be filled in by the evaluator, and the hooks and promises arrays are expected\n // to be extended with stubs found during parsing. (This weird usage model is necessary so that\n // if the root value turns out to be a promise, its `parent` in `promises` can be the payload\n // object itself.)\n //\n // When done, the payload takes ownership of the final value and all the stubs within. It may\n // modify the value in preparation for delivery, and may deliver the value directly to the app\n // without copying.\n static forEvaluate(hooks, promises) {\n return new _RpcPayload(null, \"owned\", hooks, promises);\n }\n // Deep-copy the given value, including dup()ing all stubs.\n //\n // If `value` is a function, it should be bound to `oldParent` as its `this`.\n //\n // If deep-copying from a branch of some other RpcPayload, it must be provided, to make sure\n // RpcTargets found within don't get duplicate stubs.\n static deepCopyFrom(value, oldParent, owner) {\n let result = new _RpcPayload(null, \"owned\", [], []);\n result.value = result.deepCopy(\n value,\n oldParent,\n \"value\",\n result,\n /*dupStubs=*/\n true,\n owner\n );\n return result;\n }\n // For `source === \"return\"` payloads only, this tracks any StubHooks created around RpcTargets\n // or WritableStreams found in the payload at the time that it is serialized (or deep-copied) for\n // return, so that we can make sure they are not disposed before the pipeline ends.\n //\n // This is initialized on first use.\n rpcTargets;\n // Get the StubHook representing the given RpcTarget found inside this payload.\n getHookForRpcTarget(target, parent, dupStubs = true) {\n if (this.source === \"params\") {\n if (dupStubs) {\n let dupable = target;\n if (typeof dupable.dup === \"function\") {\n target = dupable.dup();\n }\n }\n return TargetStubHook.create(target, parent);\n } else if (this.source === \"return\") {\n let hook = this.rpcTargets?.get(target);\n if (hook) {\n if (dupStubs) {\n return hook.dup();\n } else {\n this.rpcTargets?.delete(target);\n return hook;\n }\n } else {\n hook = TargetStubHook.create(target, parent);\n if (dupStubs) {\n if (!this.rpcTargets) {\n this.rpcTargets = /* @__PURE__ */ new Map();\n }\n this.rpcTargets.set(target, hook);\n return hook.dup();\n } else {\n return hook;\n }\n }\n } else {\n throw new Error(\"owned payload shouldn't contain raw RpcTargets\");\n }\n }\n // Get the StubHook representing the given WritableStream found inside this payload.\n getHookForWritableStream(stream, parent, dupStubs = true) {\n if (this.source === \"params\") {\n return streamImpl.createWritableStreamHook(stream);\n } else if (this.source === \"return\") {\n let hook = this.rpcTargets?.get(stream);\n if (hook) {\n if (dupStubs) {\n return hook.dup();\n } else {\n this.rpcTargets?.delete(stream);\n return hook;\n }\n } else {\n hook = streamImpl.createWritableStreamHook(stream);\n if (dupStubs) {\n if (!this.rpcTargets) {\n this.rpcTargets = /* @__PURE__ */ new Map();\n }\n this.rpcTargets.set(stream, hook);\n return hook.dup();\n } else {\n return hook;\n }\n }\n } else {\n throw new Error(\"owned payload shouldn't contain raw WritableStreams\");\n }\n }\n // Get the StubHook representing the given ReadableStream found inside this payload.\n getHookForReadableStream(stream, parent, dupStubs = true) {\n if (this.source === \"params\") {\n return streamImpl.createReadableStreamHook(stream);\n } else if (this.source === \"return\") {\n let hook = this.rpcTargets?.get(stream);\n if (hook) {\n if (dupStubs) {\n return hook.dup();\n } else {\n this.rpcTargets?.delete(stream);\n return hook;\n }\n } else {\n hook = streamImpl.createReadableStreamHook(stream);\n if (dupStubs) {\n if (!this.rpcTargets) {\n this.rpcTargets = /* @__PURE__ */ new Map();\n }\n this.rpcTargets.set(stream, hook);\n return hook.dup();\n } else {\n return hook;\n }\n }\n } else {\n throw new Error(\"owned payload shouldn't contain raw ReadableStreams\");\n }\n }\n deepCopy(value, oldParent, property, parent, dupStubs, owner) {\n let kind = typeForRpc(value);\n switch (kind) {\n case \"unsupported\":\n return value;\n case \"primitive\":\n case \"bigint\":\n case \"date\":\n case \"bytes\":\n case \"error\":\n case \"undefined\":\n return value;\n case \"array\": {\n let array = value;\n let len = array.length;\n let result = new Array(len);\n for (let i = 0; i < len; i++) {\n result[i] = this.deepCopy(array[i], array, i, result, dupStubs, owner);\n }\n return result;\n }\n case \"object\": {\n let result = {};\n let object = value;\n for (let i in object) {\n result[i] = this.deepCopy(object[i], object, i, result, dupStubs, owner);\n }\n return result;\n }\n case \"stub\":\n case \"rpc-promise\": {\n let stub = value;\n let hook;\n if (dupStubs) {\n hook = unwrapStubAndDup(stub);\n } else {\n hook = unwrapStubTakingOwnership(stub);\n }\n if (stub instanceof RpcPromise) {\n let promise = new RpcPromise(hook, []);\n this.promises.push({ parent, property, promise });\n return promise;\n } else {\n this.hooks.push(hook);\n return new RpcStub(hook);\n }\n }\n case \"function\":\n case \"rpc-target\": {\n let target = value;\n let hook;\n if (owner) {\n hook = owner.getHookForRpcTarget(target, oldParent, dupStubs);\n } else {\n hook = TargetStubHook.create(target, oldParent);\n }\n this.hooks.push(hook);\n return new RpcStub(hook);\n }\n case \"rpc-thenable\": {\n let target = value;\n let promise;\n if (owner) {\n promise = new RpcPromise(owner.getHookForRpcTarget(target, oldParent, dupStubs), []);\n } else {\n promise = new RpcPromise(TargetStubHook.create(target, oldParent), []);\n }\n this.promises.push({ parent, property, promise });\n return promise;\n }\n case \"writable\": {\n let stream = value;\n let hook;\n if (owner) {\n hook = owner.getHookForWritableStream(stream, oldParent, dupStubs);\n } else {\n hook = streamImpl.createWritableStreamHook(stream);\n }\n this.hooks.push(hook);\n return stream;\n }\n case \"readable\": {\n let stream = value;\n let hook;\n if (owner) {\n hook = owner.getHookForReadableStream(stream, oldParent, dupStubs);\n } else {\n hook = streamImpl.createReadableStreamHook(stream);\n }\n this.hooks.push(hook);\n return stream;\n }\n case \"headers\":\n return new Headers(value);\n case \"request\": {\n let req = value;\n if (req.body) {\n this.deepCopy(req.body, req, \"body\", req, dupStubs, owner);\n }\n return new Request(req);\n }\n case \"response\": {\n let resp = value;\n if (resp.body) {\n this.deepCopy(resp.body, resp, \"body\", resp, dupStubs, owner);\n }\n return new Response(resp.body, resp);\n }\n default:\n throw new Error(\"unreachable\");\n }\n }\n // Ensures that if the value originally came from an unowned source, we have replaced it with a\n // deep copy.\n ensureDeepCopied() {\n if (this.source !== \"owned\") {\n let dupStubs = this.source === \"params\";\n this.hooks = [];\n this.promises = [];\n try {\n this.value = this.deepCopy(this.value, void 0, \"value\", this, dupStubs, this);\n } catch (err) {\n this.hooks = void 0;\n this.promises = void 0;\n throw err;\n }\n this.source = \"owned\";\n if (this.rpcTargets && this.rpcTargets.size > 0) {\n throw new Error(\"Not all rpcTargets were accounted for in deep-copy?\");\n }\n this.rpcTargets = void 0;\n }\n }\n // Resolve all promises in this payload and then assign the final value into `parent[property]`.\n deliverTo(parent, property, promises) {\n this.ensureDeepCopied();\n if (this.value instanceof RpcPromise) {\n _RpcPayload.deliverRpcPromiseTo(this.value, parent, property, promises);\n } else {\n parent[property] = this.value;\n for (let record of this.promises) {\n _RpcPayload.deliverRpcPromiseTo(record.promise, record.parent, record.property, promises);\n }\n }\n }\n static deliverRpcPromiseTo(promise, parent, property, promises) {\n let hook = unwrapStubNoProperties(promise);\n if (!hook) {\n throw new Error(\"property promises should have been resolved earlier\");\n }\n let inner = hook.pull();\n if (inner instanceof _RpcPayload) {\n inner.deliverTo(parent, property, promises);\n } else {\n promises.push(inner.then((payload) => {\n let subPromises = [];\n payload.deliverTo(parent, property, subPromises);\n if (subPromises.length > 0) {\n return Promise.all(subPromises);\n }\n }));\n }\n }\n // Call the given function with the payload as an argument. The call is made synchronously if\n // possible, in order to maintain e-order. However, if any RpcPromises exist in the payload,\n // they are awaited and substituted before calling the function. The result of the call is\n // wrapped into another payload.\n //\n // The payload is automatically disposed after the call completes. The caller should not call\n // dispose().\n async deliverCall(func, thisArg) {\n try {\n let promises = [];\n this.deliverTo(this, \"value\", promises);\n if (promises.length > 0) {\n await Promise.all(promises);\n }\n let result = Function.prototype.apply.call(func, thisArg, this.value);\n if (result instanceof RpcPromise) {\n return _RpcPayload.fromAppReturn(result);\n } else {\n return _RpcPayload.fromAppReturn(await result);\n }\n } finally {\n this.dispose();\n }\n }\n // Produce a promise for this payload for return to the application. Any RpcPromises in the\n // payload are awaited and substituted with their results first.\n //\n // The returned object will have a disposer which disposes the payload. The caller should not\n // separately dispose it.\n async deliverResolve() {\n try {\n let promises = [];\n this.deliverTo(this, \"value\", promises);\n if (promises.length > 0) {\n await Promise.all(promises);\n }\n let result = this.value;\n if (result instanceof Object) {\n if (!(Symbol.dispose in result)) {\n Object.defineProperty(result, Symbol.dispose, {\n // NOTE: Using `this.dispose.bind(this)` here causes Playwright's build of\n // Chromium 140.0.7339.16 to fail when the object is assigned to a `using` variable,\n // with the error:\n // TypeError: Symbol(Symbol.dispose) is not a function\n // I cannot reproduce this problem in Chrome 140.0.7339.127 nor in Node or workerd,\n // so maybe it was a short-lived V8 bug or something. To be safe, though, we use\n // `() => this.dispose()`, which seems to always work.\n value: () => this.dispose(),\n writable: true,\n enumerable: false,\n configurable: true\n });\n }\n }\n return result;\n } catch (err) {\n this.dispose();\n throw err;\n }\n }\n dispose() {\n if (this.source === \"owned\") {\n this.hooks.forEach((hook) => hook.dispose());\n this.promises.forEach((promise) => promise.promise[Symbol.dispose]());\n } else if (this.source === \"return\") {\n this.disposeImpl(this.value, void 0);\n if (this.rpcTargets && this.rpcTargets.size > 0) {\n throw new Error(\"Not all rpcTargets were accounted for in disposeImpl()?\");\n }\n } else ;\n this.source = \"owned\";\n this.hooks = [];\n this.promises = [];\n }\n // Recursive dispose, called only when `source` is \"return\".\n disposeImpl(value, parent) {\n let kind = typeForRpc(value);\n switch (kind) {\n case \"unsupported\":\n case \"primitive\":\n case \"bigint\":\n case \"bytes\":\n case \"date\":\n case \"error\":\n case \"undefined\":\n return;\n case \"array\": {\n let array = value;\n let len = array.length;\n for (let i = 0; i < len; i++) {\n this.disposeImpl(array[i], array);\n }\n return;\n }\n case \"object\": {\n let object = value;\n for (let i in object) {\n this.disposeImpl(object[i], object);\n }\n return;\n }\n case \"stub\":\n case \"rpc-promise\": {\n let stub = value;\n let hook = unwrapStubNoProperties(stub);\n if (hook) {\n hook.dispose();\n }\n return;\n }\n case \"function\":\n case \"rpc-target\": {\n let target = value;\n let hook = this.rpcTargets?.get(target);\n if (hook) {\n hook.dispose();\n this.rpcTargets.delete(target);\n } else {\n disposeRpcTarget(target);\n }\n return;\n }\n case \"rpc-thenable\":\n return;\n case \"headers\":\n return;\n case \"request\": {\n let req = value;\n if (req.body) this.disposeImpl(req.body, req);\n return;\n }\n case \"response\": {\n let resp = value;\n if (resp.body) this.disposeImpl(resp.body, resp);\n return;\n }\n case \"writable\": {\n let stream = value;\n let hook = this.rpcTargets?.get(stream);\n if (hook) {\n this.rpcTargets.delete(stream);\n } else {\n hook = streamImpl.createWritableStreamHook(stream);\n }\n hook.dispose();\n return;\n }\n case \"readable\": {\n let stream = value;\n let hook = this.rpcTargets?.get(stream);\n if (hook) {\n this.rpcTargets.delete(stream);\n } else {\n hook = streamImpl.createReadableStreamHook(stream);\n }\n hook.dispose();\n return;\n }\n default:\n return;\n }\n }\n // Ignore unhandled rejections in all promises in this payload -- that is, all promises that\n // *would* be awaited if this payload were to be delivered. See the similarly-named method of\n // StubHook for explanation.\n ignoreUnhandledRejections() {\n if (this.hooks) {\n this.hooks.forEach((hook) => {\n hook.ignoreUnhandledRejections();\n });\n this.promises.forEach(\n (promise) => unwrapStubOrParent(promise.promise).ignoreUnhandledRejections()\n );\n } else {\n this.ignoreUnhandledRejectionsImpl(this.value);\n }\n }\n ignoreUnhandledRejectionsImpl(value) {\n let kind = typeForRpc(value);\n switch (kind) {\n case \"unsupported\":\n case \"primitive\":\n case \"bigint\":\n case \"bytes\":\n case \"date\":\n case \"error\":\n case \"undefined\":\n case \"function\":\n case \"rpc-target\":\n case \"writable\":\n case \"readable\":\n case \"headers\":\n case \"request\":\n case \"response\":\n return;\n case \"array\": {\n let array = value;\n let len = array.length;\n for (let i = 0; i < len; i++) {\n this.ignoreUnhandledRejectionsImpl(array[i]);\n }\n return;\n }\n case \"object\": {\n let object = value;\n for (let i in object) {\n this.ignoreUnhandledRejectionsImpl(object[i]);\n }\n return;\n }\n case \"stub\":\n case \"rpc-promise\":\n unwrapStubOrParent(value).ignoreUnhandledRejections();\n return;\n case \"rpc-thenable\":\n value.then((_) => {\n }, (_) => {\n });\n return;\n default:\n return;\n }\n }\n};\nfunction followPath(value, parent, path, owner) {\n for (let i = 0; i < path.length; i++) {\n parent = value;\n let part = path[i];\n if (part in Object.prototype) {\n value = void 0;\n continue;\n }\n let kind = typeForRpc(value);\n switch (kind) {\n case \"object\":\n case \"function\":\n if (Object.hasOwn(value, part)) {\n value = value[part];\n } else {\n value = void 0;\n }\n break;\n case \"array\":\n if (Number.isInteger(part) && part >= 0) {\n value = value[part];\n } else {\n value = void 0;\n }\n break;\n case \"rpc-target\":\n case \"rpc-thenable\": {\n if (Object.hasOwn(value, part)) {\n throw new TypeError(\n `Attempted to access property '${part}', which is an instance property of the RpcTarget. To avoid leaking private internals, instance properties cannot be accessed over RPC. If you want to make this property available over RPC, define it as a method or getter on the class, instead of an instance property.`\n );\n } else {\n value = value[part];\n }\n owner = null;\n break;\n }\n case \"stub\":\n case \"rpc-promise\": {\n let { hook, pathIfPromise } = unwrapStubAndPath(value);\n return { hook, remainingPath: pathIfPromise ? pathIfPromise.concat(path.slice(i)) : path.slice(i) };\n }\n case \"writable\":\n value = void 0;\n break;\n case \"readable\":\n value = void 0;\n break;\n case \"primitive\":\n case \"bigint\":\n case \"bytes\":\n case \"date\":\n case \"error\":\n case \"headers\":\n case \"request\":\n case \"response\":\n value = void 0;\n break;\n case \"undefined\":\n value = value[part];\n break;\n case \"unsupported\": {\n if (i === 0) {\n throw new TypeError(`RPC stub points at a non-serializable type.`);\n } else {\n let prefix = path.slice(0, i).join(\".\");\n let remainder = path.slice(0, i).join(\".\");\n throw new TypeError(\n `'${prefix}' is not a serializable type, so property ${remainder} cannot be accessed.`\n );\n }\n }\n default:\n throw new TypeError(\"unreachable\");\n }\n }\n if (value instanceof RpcPromise) {\n let { hook, pathIfPromise } = unwrapStubAndPath(value);\n return { hook, remainingPath: pathIfPromise || [] };\n }\n return {\n value,\n parent,\n owner\n };\n}\nvar ValueStubHook = class extends StubHook {\n call(path, args) {\n try {\n let { value, owner } = this.getValue();\n let followResult = followPath(value, void 0, path, owner);\n if (followResult.hook) {\n return followResult.hook.call(followResult.remainingPath, args);\n }\n if (typeof followResult.value != \"function\") {\n throw new TypeError(`'${path.join(\".\")}' is not a function.`);\n }\n let promise = args.deliverCall(followResult.value, followResult.parent);\n return new PromiseStubHook(promise.then((payload) => {\n return new PayloadStubHook(payload);\n }));\n } catch (err) {\n return new ErrorStubHook(err);\n }\n }\n map(path, captures, instructions) {\n try {\n let followResult;\n try {\n let { value, owner } = this.getValue();\n followResult = followPath(value, void 0, path, owner);\n ;\n } catch (err) {\n for (let cap of captures) {\n cap.dispose();\n }\n throw err;\n }\n if (followResult.hook) {\n return followResult.hook.map(followResult.remainingPath, captures, instructions);\n }\n return mapImpl.applyMap(\n followResult.value,\n followResult.parent,\n followResult.owner,\n captures,\n instructions\n );\n } catch (err) {\n return new ErrorStubHook(err);\n }\n }\n get(path) {\n try {\n let { value, owner } = this.getValue();\n if (path.length === 0 && owner === null) {\n throw new Error(\"Can't dup an RpcTarget stub as a promise.\");\n }\n let followResult = followPath(value, void 0, path, owner);\n if (followResult.hook) {\n return followResult.hook.get(followResult.remainingPath);\n }\n return new PayloadStubHook(RpcPayload.deepCopyFrom(\n followResult.value,\n followResult.parent,\n followResult.owner\n ));\n } catch (err) {\n return new ErrorStubHook(err);\n }\n }\n};\nvar PayloadStubHook = class _PayloadStubHook extends ValueStubHook {\n constructor(payload) {\n super();\n this.payload = payload;\n }\n payload;\n // cleared when disposed\n getPayload() {\n if (this.payload) {\n return this.payload;\n } else {\n throw new Error(\"Attempted to use an RPC StubHook after it was disposed.\");\n }\n }\n getValue() {\n let payload = this.getPayload();\n return { value: payload.value, owner: payload };\n }\n dup() {\n let thisPayload = this.getPayload();\n return new _PayloadStubHook(RpcPayload.deepCopyFrom(\n thisPayload.value,\n void 0,\n thisPayload\n ));\n }\n pull() {\n return this.getPayload();\n }\n ignoreUnhandledRejections() {\n if (this.payload) {\n this.payload.ignoreUnhandledRejections();\n }\n }\n dispose() {\n if (this.payload) {\n this.payload.dispose();\n this.payload = void 0;\n }\n }\n onBroken(callback) {\n if (this.payload) {\n if (this.payload.value instanceof RpcStub) {\n this.payload.value.onRpcBroken(callback);\n }\n }\n }\n};\nfunction disposeRpcTarget(target) {\n if (Symbol.dispose in target) {\n try {\n target[Symbol.dispose]();\n } catch (err) {\n Promise.reject(err);\n }\n }\n}\nvar TargetStubHook = class _TargetStubHook extends ValueStubHook {\n // Constructs a TargetStubHook that is not duplicated from an existing hook.\n //\n // If `value` is a function, `parent` is bound as its \"this\".\n static create(value, parent) {\n if (typeof value !== \"function\") {\n parent = void 0;\n }\n return new _TargetStubHook(value, parent);\n }\n constructor(target, parent, dupFrom) {\n super();\n this.target = target;\n this.parent = parent;\n if (dupFrom) {\n if (dupFrom.refcount) {\n this.refcount = dupFrom.refcount;\n ++this.refcount.count;\n }\n } else if (Symbol.dispose in target) {\n this.refcount = { count: 1 };\n }\n }\n target;\n // cleared when disposed\n parent;\n // `this` parameter when calling `target`\n refcount;\n // undefined if not needed (because target has no disposer)\n getTarget() {\n if (this.target) {\n return this.target;\n } else {\n throw new Error(\"Attempted to use an RPC StubHook after it was disposed.\");\n }\n }\n getValue() {\n return { value: this.getTarget(), owner: null };\n }\n dup() {\n return new _TargetStubHook(this.getTarget(), this.parent, this);\n }\n pull() {\n let target = this.getTarget();\n if (\"then\" in target) {\n return Promise.resolve(target).then((resolution) => {\n return RpcPayload.fromAppReturn(resolution);\n });\n } else {\n return Promise.reject(new Error(\"Tried to resolve a non-promise stub.\"));\n }\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n if (this.target) {\n if (this.refcount) {\n if (--this.refcount.count == 0) {\n disposeRpcTarget(this.target);\n }\n }\n this.target = void 0;\n }\n }\n onBroken(callback) {\n }\n};\nvar PromiseStubHook = class _PromiseStubHook extends StubHook {\n promise;\n resolution;\n constructor(promise) {\n super();\n this.promise = promise.then((res) => {\n this.resolution = res;\n return res;\n });\n }\n call(path, args) {\n args.ensureDeepCopied();\n return new _PromiseStubHook(this.promise.then((hook) => hook.call(path, args)));\n }\n stream(path, args) {\n args.ensureDeepCopied();\n let promise = this.promise.then((hook) => {\n let result = hook.stream(path, args);\n return result.promise;\n });\n return { promise };\n }\n map(path, captures, instructions) {\n return new _PromiseStubHook(this.promise.then(\n (hook) => hook.map(path, captures, instructions),\n (err) => {\n for (let cap of captures) {\n cap.dispose();\n }\n throw err;\n }\n ));\n }\n get(path) {\n return new _PromiseStubHook(this.promise.then((hook) => hook.get(path)));\n }\n dup() {\n if (this.resolution) {\n return this.resolution.dup();\n } else {\n return new _PromiseStubHook(this.promise.then((hook) => hook.dup()));\n }\n }\n pull() {\n if (this.resolution) {\n return this.resolution.pull();\n } else {\n return this.promise.then((hook) => hook.pull());\n }\n }\n ignoreUnhandledRejections() {\n if (this.resolution) {\n this.resolution.ignoreUnhandledRejections();\n } else {\n this.promise.then((res) => {\n res.ignoreUnhandledRejections();\n }, (err) => {\n });\n }\n }\n dispose() {\n if (this.resolution) {\n this.resolution.dispose();\n } else {\n this.promise.then((hook) => {\n hook.dispose();\n }, (err) => {\n });\n }\n }\n onBroken(callback) {\n if (this.resolution) {\n this.resolution.onBroken(callback);\n } else {\n this.promise.then((hook) => {\n hook.onBroken(callback);\n }, callback);\n }\n }\n};\nvar NullExporter = class {\n exportStub(stub) {\n throw new Error(\"Cannot serialize RPC stubs without an RPC session.\");\n }\n exportPromise(stub) {\n throw new Error(\"Cannot serialize RPC stubs without an RPC session.\");\n }\n getImport(hook) {\n return void 0;\n }\n unexport(ids) {\n }\n createPipe(readable) {\n throw new Error(\"Cannot create pipes without an RPC session.\");\n }\n onSendError(error) {\n }\n};\nvar NULL_EXPORTER = new NullExporter();\nvar ERROR_TYPES = {\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n AggregateError\n // TODO: DOMError? Others?\n};\nvar Devaluator = class _Devaluator {\n constructor(exporter, source) {\n this.exporter = exporter;\n this.source = source;\n }\n // Devaluate the given value.\n // * value: The value to devaluate.\n // * parent: The value's parent object, which would be used as `this` if the value were called\n // as a function.\n // * exporter: Callbacks to the RPC session for exporting capabilities found in this message.\n // * source: The RpcPayload which contains the value, and therefore owns stubs within.\n //\n // Returns: The devaluated value, ready to be JSON-serialized.\n static devaluate(value, parent, exporter = NULL_EXPORTER, source) {\n let devaluator = new _Devaluator(exporter, source);\n try {\n return devaluator.devaluateImpl(value, parent, 0);\n } catch (err) {\n if (devaluator.exports) {\n try {\n exporter.unexport(devaluator.exports);\n } catch (err2) {\n }\n }\n throw err;\n }\n }\n exports;\n devaluateImpl(value, parent, depth) {\n if (depth >= 64) {\n throw new Error(\n \"Serialization exceeded maximum allowed depth. (Does the message contain cycles?)\"\n );\n }\n let kind = typeForRpc(value);\n switch (kind) {\n case \"unsupported\": {\n let msg;\n try {\n msg = `Cannot serialize value: ${value}`;\n } catch (err) {\n msg = \"Cannot serialize value: (couldn't stringify value)\";\n }\n throw new TypeError(msg);\n }\n case \"primitive\":\n if (typeof value === \"number\" && !isFinite(value)) {\n if (value === Infinity) {\n return [\"inf\"];\n } else if (value === -Infinity) {\n return [\"-inf\"];\n } else {\n return [\"nan\"];\n }\n } else {\n return value;\n }\n case \"object\": {\n let object = value;\n let result = {};\n for (let key in object) {\n result[key] = this.devaluateImpl(object[key], object, depth + 1);\n }\n return result;\n }\n case \"array\": {\n let array = value;\n let len = array.length;\n let result = new Array(len);\n for (let i = 0; i < len; i++) {\n result[i] = this.devaluateImpl(array[i], array, depth + 1);\n }\n return [result];\n }\n case \"bigint\":\n return [\"bigint\", value.toString()];\n case \"date\":\n return [\"date\", value.getTime()];\n case \"bytes\": {\n let bytes = value;\n if (bytes.toBase64) {\n return [\"bytes\", bytes.toBase64({ omitPadding: true })];\n } else {\n return [\n \"bytes\",\n btoa(String.fromCharCode.apply(null, bytes).replace(/=*$/, \"\"))\n ];\n }\n }\n case \"headers\":\n return [\"headers\", [...value]];\n case \"request\": {\n let req = value;\n let init = {};\n if (req.method !== \"GET\") init.method = req.method;\n let headers = [...req.headers];\n if (headers.length > 0) {\n init.headers = headers;\n }\n if (req.body) {\n init.body = this.devaluateImpl(req.body, req, depth + 1);\n init.duplex = req.duplex || \"half\";\n } else if (req.body === void 0 && ![\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\", \"DELETE\"].includes(req.method)) {\n let bodyPromise = req.arrayBuffer();\n let readable = new ReadableStream({\n async start(controller) {\n try {\n controller.enqueue(new Uint8Array(await bodyPromise));\n controller.close();\n } catch (err) {\n controller.error(err);\n }\n }\n });\n let hook = streamImpl.createReadableStreamHook(readable);\n let importId = this.exporter.createPipe(readable, hook);\n init.body = [\"readable\", importId];\n init.duplex = req.duplex || \"half\";\n }\n if (req.cache && req.cache !== \"default\") init.cache = req.cache;\n if (req.redirect !== \"follow\") init.redirect = req.redirect;\n if (req.integrity) init.integrity = req.integrity;\n if (req.mode && req.mode !== \"cors\") init.mode = req.mode;\n if (req.credentials && req.credentials !== \"same-origin\") {\n init.credentials = req.credentials;\n }\n if (req.referrer && req.referrer !== \"about:client\") init.referrer = req.referrer;\n if (req.referrerPolicy) init.referrerPolicy = req.referrerPolicy;\n if (req.keepalive) init.keepalive = req.keepalive;\n let cfReq = req;\n if (cfReq.cf) init.cf = cfReq.cf;\n if (cfReq.encodeResponseBody && cfReq.encodeResponseBody !== \"automatic\") {\n init.encodeResponseBody = cfReq.encodeResponseBody;\n }\n return [\"request\", req.url, init];\n }\n case \"response\": {\n let resp = value;\n let body = this.devaluateImpl(resp.body, resp, depth + 1);\n let init = {};\n if (resp.status !== 200) init.status = resp.status;\n if (resp.statusText) init.statusText = resp.statusText;\n let headers = [...resp.headers];\n if (headers.length > 0) {\n init.headers = headers;\n }\n let cfResp = resp;\n if (cfResp.cf) init.cf = cfResp.cf;\n if (cfResp.encodeBody && cfResp.encodeBody !== \"automatic\") {\n init.encodeBody = cfResp.encodeBody;\n }\n if (cfResp.webSocket) {\n throw new TypeError(\"Can't serialize a Response containing a webSocket.\");\n }\n return [\"response\", body, init];\n }\n case \"error\": {\n let e = value;\n let rewritten = this.exporter.onSendError(e);\n if (rewritten) {\n e = rewritten;\n }\n let result = [\"error\", e.name, e.message];\n if (rewritten && rewritten.stack) {\n result.push(rewritten.stack);\n }\n return result;\n }\n case \"undefined\":\n return [\"undefined\"];\n case \"stub\":\n case \"rpc-promise\": {\n if (!this.source) {\n throw new Error(\"Can't serialize RPC stubs in this context.\");\n }\n let { hook, pathIfPromise } = unwrapStubAndPath(value);\n let importId = this.exporter.getImport(hook);\n if (importId !== void 0) {\n if (pathIfPromise) {\n if (pathIfPromise.length > 0) {\n return [\"pipeline\", importId, pathIfPromise];\n } else {\n return [\"pipeline\", importId];\n }\n } else {\n return [\"import\", importId];\n }\n }\n if (pathIfPromise) {\n hook = hook.get(pathIfPromise);\n } else {\n hook = hook.dup();\n }\n return this.devaluateHook(pathIfPromise ? \"promise\" : \"export\", hook);\n }\n case \"function\":\n case \"rpc-target\": {\n if (!this.source) {\n throw new Error(\"Can't serialize RPC stubs in this context.\");\n }\n let hook = this.source.getHookForRpcTarget(value, parent);\n return this.devaluateHook(\"export\", hook);\n }\n case \"rpc-thenable\": {\n if (!this.source) {\n throw new Error(\"Can't serialize RPC stubs in this context.\");\n }\n let hook = this.source.getHookForRpcTarget(value, parent);\n return this.devaluateHook(\"promise\", hook);\n }\n case \"writable\": {\n if (!this.source) {\n throw new Error(\"Can't serialize WritableStream in this context.\");\n }\n let hook = this.source.getHookForWritableStream(value, parent);\n return this.devaluateHook(\"writable\", hook);\n }\n case \"readable\": {\n if (!this.source) {\n throw new Error(\"Can't serialize ReadableStream in this context.\");\n }\n let ws = value;\n let hook = this.source.getHookForReadableStream(ws, parent);\n let importId = this.exporter.createPipe(ws, hook);\n return [\"readable\", importId];\n }\n default:\n throw new Error(\"unreachable\");\n }\n }\n devaluateHook(type, hook) {\n if (!this.exports) this.exports = [];\n let exportId = type === \"promise\" ? this.exporter.exportPromise(hook) : this.exporter.exportStub(hook);\n this.exports.push(exportId);\n return [type, exportId];\n }\n};\nvar NullImporter = class {\n importStub(idx) {\n throw new Error(\"Cannot deserialize RPC stubs without an RPC session.\");\n }\n importPromise(idx) {\n throw new Error(\"Cannot deserialize RPC stubs without an RPC session.\");\n }\n getExport(idx) {\n return void 0;\n }\n getPipeReadable(exportId) {\n throw new Error(\"Cannot retrieve pipe readable without an RPC session.\");\n }\n};\nvar NULL_IMPORTER = new NullImporter();\nfunction fixBrokenRequestBody(request, body) {\n let promise = new Response(body).arrayBuffer().then((arrayBuffer) => {\n let bytes = new Uint8Array(arrayBuffer);\n let result = new Request(request, { body: bytes });\n return new PayloadStubHook(RpcPayload.fromAppReturn(result));\n });\n return new RpcPromise(new PromiseStubHook(promise), []);\n}\nvar Evaluator = class _Evaluator {\n constructor(importer) {\n this.importer = importer;\n }\n hooks = [];\n promises = [];\n evaluate(value) {\n let payload = RpcPayload.forEvaluate(this.hooks, this.promises);\n try {\n payload.value = this.evaluateImpl(value, payload, \"value\");\n return payload;\n } catch (err) {\n payload.dispose();\n throw err;\n }\n }\n // Evaluate the value without destroying it.\n evaluateCopy(value) {\n return this.evaluate(structuredClone(value));\n }\n evaluateImpl(value, parent, property) {\n if (value instanceof Array) {\n if (value.length == 1 && value[0] instanceof Array) {\n let result = value[0];\n for (let i = 0; i < result.length; i++) {\n result[i] = this.evaluateImpl(result[i], result, i);\n }\n return result;\n } else switch (value[0]) {\n case \"bigint\":\n if (typeof value[1] == \"string\") {\n return BigInt(value[1]);\n }\n break;\n case \"date\":\n if (typeof value[1] == \"number\") {\n return new Date(value[1]);\n }\n break;\n case \"bytes\": {\n let b64 = Uint8Array;\n if (typeof value[1] == \"string\") {\n if (b64.fromBase64) {\n return b64.fromBase64(value[1]);\n } else {\n let bs = atob(value[1]);\n let len = bs.length;\n let bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = bs.charCodeAt(i);\n }\n return bytes;\n }\n }\n break;\n }\n case \"error\":\n if (value.length >= 3 && typeof value[1] === \"string\" && typeof value[2] === \"string\") {\n let cls = ERROR_TYPES[value[1]] || Error;\n let result = new cls(value[2]);\n if (typeof value[3] === \"string\") {\n result.stack = value[3];\n }\n return result;\n }\n break;\n case \"undefined\":\n if (value.length === 1) {\n return void 0;\n }\n break;\n case \"inf\":\n return Infinity;\n case \"-inf\":\n return -Infinity;\n case \"nan\":\n return NaN;\n case \"headers\":\n if (value.length === 2 && value[1] instanceof Array) {\n return new Headers(value[1]);\n }\n break;\n case \"request\": {\n if (value.length !== 3 || typeof value[1] !== \"string\") break;\n let url = value[1];\n let init = value[2];\n if (typeof init !== \"object\" || init === null) break;\n if (init.body) {\n init.body = this.evaluateImpl(init.body, init, \"body\");\n if (init.body === null || typeof init.body === \"string\" || init.body instanceof Uint8Array || init.body instanceof ReadableStream) ;\n else {\n throw new TypeError(\"Request body must be of type ReadableStream.\");\n }\n }\n if (init.signal) {\n init.signal = this.evaluateImpl(init.signal, init, \"signal\");\n if (!(init.signal instanceof AbortSignal)) {\n throw new TypeError(\"Request siganl must be of type AbortSignal.\");\n }\n }\n if (init.headers && !(init.headers instanceof Array)) {\n throw new TypeError(\"Request headers must be serialized as an array of pairs.\");\n }\n let result = new Request(url, init);\n if (init.body instanceof ReadableStream && result.body === void 0) {\n let promise = fixBrokenRequestBody(result, init.body);\n this.promises.push({ promise, parent, property });\n return promise;\n } else {\n return result;\n }\n }\n case \"response\": {\n if (value.length !== 3) break;\n let body = this.evaluateImpl(value[1], parent, property);\n if (body === null || typeof body === \"string\" || body instanceof Uint8Array || body instanceof ReadableStream) ;\n else {\n throw new TypeError(\"Response body must be of type ReadableStream.\");\n }\n let init = value[2];\n if (typeof init !== \"object\" || init === null) break;\n if (init.webSocket) {\n throw new TypeError(\"Can't deserialize a Response containing a webSocket.\");\n }\n if (init.headers && !(init.headers instanceof Array)) {\n throw new TypeError(\"Request headers must be serialized as an array of pairs.\");\n }\n return new Response(body, init);\n }\n case \"import\":\n case \"pipeline\": {\n if (value.length < 2 || value.length > 4) {\n break;\n }\n if (typeof value[1] != \"number\") {\n break;\n }\n let hook = this.importer.getExport(value[1]);\n if (!hook) {\n throw new Error(`no such entry on exports table: ${value[1]}`);\n }\n let isPromise = value[0] == \"pipeline\";\n let addStub = (hook2) => {\n if (isPromise) {\n let promise = new RpcPromise(hook2, []);\n this.promises.push({ promise, parent, property });\n return promise;\n } else {\n this.hooks.push(hook2);\n return new RpcPromise(hook2, []);\n }\n };\n if (value.length == 2) {\n if (isPromise) {\n return addStub(hook.get([]));\n } else {\n return addStub(hook.dup());\n }\n }\n let path = value[2];\n if (!(path instanceof Array)) {\n break;\n }\n if (!path.every(\n (part) => {\n return typeof part == \"string\" || typeof part == \"number\";\n }\n )) {\n break;\n }\n if (value.length == 3) {\n return addStub(hook.get(path));\n }\n let args = value[3];\n if (!(args instanceof Array)) {\n break;\n }\n let subEval = new _Evaluator(this.importer);\n args = subEval.evaluate([args]);\n return addStub(hook.call(path, args));\n }\n case \"remap\": {\n if (value.length !== 5 || typeof value[1] !== \"number\" || !(value[2] instanceof Array) || !(value[3] instanceof Array) || !(value[4] instanceof Array)) {\n break;\n }\n let hook = this.importer.getExport(value[1]);\n if (!hook) {\n throw new Error(`no such entry on exports table: ${value[1]}`);\n }\n let path = value[2];\n if (!path.every(\n (part) => {\n return typeof part == \"string\" || typeof part == \"number\";\n }\n )) {\n break;\n }\n let captures = value[3].map((cap) => {\n if (!(cap instanceof Array) || cap.length !== 2 || cap[0] !== \"import\" && cap[0] !== \"export\" || typeof cap[1] !== \"number\") {\n throw new TypeError(`unknown map capture: ${JSON.stringify(cap)}`);\n }\n if (cap[0] === \"export\") {\n return this.importer.importStub(cap[1]);\n } else {\n let exp = this.importer.getExport(cap[1]);\n if (!exp) {\n throw new Error(`no such entry on exports table: ${cap[1]}`);\n }\n return exp.dup();\n }\n });\n let instructions = value[4];\n let resultHook = hook.map(path, captures, instructions);\n let promise = new RpcPromise(resultHook, []);\n this.promises.push({ promise, parent, property });\n return promise;\n }\n case \"export\":\n case \"promise\":\n if (typeof value[1] == \"number\") {\n if (value[0] == \"promise\") {\n let hook = this.importer.importPromise(value[1]);\n let promise = new RpcPromise(hook, []);\n this.promises.push({ parent, property, promise });\n return promise;\n } else {\n let hook = this.importer.importStub(value[1]);\n this.hooks.push(hook);\n return new RpcStub(hook);\n }\n }\n break;\n case \"writable\":\n if (typeof value[1] == \"number\") {\n let hook = this.importer.importStub(value[1]);\n let stream = streamImpl.createWritableStreamFromHook(hook);\n this.hooks.push(hook);\n return stream;\n }\n break;\n case \"readable\":\n if (typeof value[1] == \"number\") {\n let stream = this.importer.getPipeReadable(value[1]);\n let hook = streamImpl.createReadableStreamHook(stream);\n this.hooks.push(hook);\n return stream;\n }\n break;\n }\n throw new TypeError(`unknown special value: ${JSON.stringify(value)}`);\n } else if (value instanceof Object) {\n let result = value;\n for (let key in result) {\n if (key in Object.prototype || key === \"toJSON\") {\n this.evaluateImpl(result[key], result, key);\n delete result[key];\n } else {\n result[key] = this.evaluateImpl(result[key], result, key);\n }\n }\n return result;\n } else {\n return value;\n }\n }\n};\nvar ImportTableEntry = class {\n constructor(session, importId, pulling) {\n this.session = session;\n this.importId = importId;\n if (pulling) {\n this.activePull = Promise.withResolvers();\n }\n }\n localRefcount = 0;\n remoteRefcount = 1;\n activePull;\n resolution;\n // List of integer indexes into session.onBrokenCallbacks which are callbacks registered on\n // this import. Initialized on first use (so `undefined` is the same as an empty list).\n onBrokenRegistrations;\n resolve(resolution) {\n if (this.localRefcount == 0) {\n resolution.dispose();\n return;\n }\n this.resolution = resolution;\n this.sendRelease();\n if (this.onBrokenRegistrations) {\n for (let i of this.onBrokenRegistrations) {\n let callback = this.session.onBrokenCallbacks[i];\n let endIndex = this.session.onBrokenCallbacks.length;\n resolution.onBroken(callback);\n if (this.session.onBrokenCallbacks[endIndex] === callback) {\n delete this.session.onBrokenCallbacks[endIndex];\n } else {\n delete this.session.onBrokenCallbacks[i];\n }\n }\n this.onBrokenRegistrations = void 0;\n }\n if (this.activePull) {\n this.activePull.resolve();\n this.activePull = void 0;\n }\n }\n async awaitResolution() {\n if (!this.activePull) {\n this.session.sendPull(this.importId);\n this.activePull = Promise.withResolvers();\n }\n await this.activePull.promise;\n return this.resolution.pull();\n }\n dispose() {\n if (this.resolution) {\n this.resolution.dispose();\n } else {\n this.abort(new Error(\"RPC was canceled because the RpcPromise was disposed.\"));\n this.sendRelease();\n }\n }\n abort(error) {\n if (!this.resolution) {\n this.resolution = new ErrorStubHook(error);\n if (this.activePull) {\n this.activePull.reject(error);\n this.activePull = void 0;\n }\n this.onBrokenRegistrations = void 0;\n }\n }\n onBroken(callback) {\n if (this.resolution) {\n this.resolution.onBroken(callback);\n } else {\n let index = this.session.onBrokenCallbacks.length;\n this.session.onBrokenCallbacks.push(callback);\n if (!this.onBrokenRegistrations) this.onBrokenRegistrations = [];\n this.onBrokenRegistrations.push(index);\n }\n }\n sendRelease() {\n if (this.remoteRefcount > 0) {\n this.session.sendRelease(this.importId, this.remoteRefcount);\n this.remoteRefcount = 0;\n }\n }\n};\nvar RpcImportHook = class _RpcImportHook extends StubHook {\n // undefined when we're disposed\n // `pulling` is true if we already expect that this import is going to be resolved later, and\n // null if this import is not allowed to be pulled (i.e. it's a stub not a promise).\n constructor(isPromise, entry) {\n super();\n this.isPromise = isPromise;\n ++entry.localRefcount;\n this.entry = entry;\n }\n entry;\n collectPath(path) {\n return this;\n }\n getEntry() {\n if (this.entry) {\n return this.entry;\n } else {\n throw new Error(\"This RpcImportHook was already disposed.\");\n }\n }\n // -------------------------------------------------------------------------------------\n // implements StubHook\n call(path, args) {\n let entry = this.getEntry();\n if (entry.resolution) {\n return entry.resolution.call(path, args);\n } else {\n return entry.session.sendCall(entry.importId, path, args);\n }\n }\n stream(path, args) {\n let entry = this.getEntry();\n if (entry.resolution) {\n return entry.resolution.stream(path, args);\n } else {\n return entry.session.sendStream(entry.importId, path, args);\n }\n }\n map(path, captures, instructions) {\n let entry;\n try {\n entry = this.getEntry();\n } catch (err) {\n for (let cap of captures) {\n cap.dispose();\n }\n throw err;\n }\n if (entry.resolution) {\n return entry.resolution.map(path, captures, instructions);\n } else {\n return entry.session.sendMap(entry.importId, path, captures, instructions);\n }\n }\n get(path) {\n let entry = this.getEntry();\n if (entry.resolution) {\n return entry.resolution.get(path);\n } else {\n return entry.session.sendCall(entry.importId, path);\n }\n }\n dup() {\n return new _RpcImportHook(false, this.getEntry());\n }\n pull() {\n let entry = this.getEntry();\n if (!this.isPromise) {\n throw new Error(\"Can't pull this hook because it's not a promise hook.\");\n }\n if (entry.resolution) {\n return entry.resolution.pull();\n }\n return entry.awaitResolution();\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n let entry = this.entry;\n this.entry = void 0;\n if (entry) {\n if (--entry.localRefcount === 0) {\n entry.dispose();\n }\n }\n }\n onBroken(callback) {\n if (this.entry) {\n this.entry.onBroken(callback);\n }\n }\n};\nvar RpcMainHook = class extends RpcImportHook {\n session;\n constructor(entry) {\n super(false, entry);\n this.session = entry.session;\n }\n dispose() {\n if (this.session) {\n let session = this.session;\n this.session = void 0;\n session.shutdown();\n }\n }\n};\nvar RpcSessionImpl = class {\n constructor(transport, mainHook, options) {\n this.transport = transport;\n this.options = options;\n this.exports.push({ hook: mainHook, refcount: 1 });\n this.imports.push(new ImportTableEntry(this, 0, false));\n let rejectFunc;\n let abortPromise = new Promise((resolve, reject) => {\n rejectFunc = reject;\n });\n this.cancelReadLoop = rejectFunc;\n this.readLoop(abortPromise).catch((err) => this.abort(err));\n }\n exports = [];\n reverseExports = /* @__PURE__ */ new Map();\n imports = [];\n abortReason;\n cancelReadLoop;\n // We assign positive numbers to imports we initiate, and negative numbers to exports we\n // initiate. So the next import ID is just `imports.length`, but the next export ID needs\n // to be tracked explicitly.\n nextExportId = -1;\n // If set, call this when all incoming calls are complete.\n onBatchDone;\n // How many promises is our peer expecting us to resolve?\n pullCount = 0;\n // Sparse array of onBrokenCallback registrations. Items are strictly appended to the end but\n // may be deleted from the middle (hence leaving the array sparse).\n onBrokenCallbacks = [];\n // Should only be called once immediately after construction.\n getMainImport() {\n return new RpcMainHook(this.imports[0]);\n }\n shutdown() {\n this.abort(new Error(\"RPC session was shut down by disposing the main stub\"), false);\n }\n exportStub(hook) {\n if (this.abortReason) throw this.abortReason;\n let existingExportId = this.reverseExports.get(hook);\n if (existingExportId !== void 0) {\n ++this.exports[existingExportId].refcount;\n return existingExportId;\n } else {\n let exportId = this.nextExportId--;\n this.exports[exportId] = { hook, refcount: 1 };\n this.reverseExports.set(hook, exportId);\n return exportId;\n }\n }\n exportPromise(hook) {\n if (this.abortReason) throw this.abortReason;\n let exportId = this.nextExportId--;\n this.exports[exportId] = { hook, refcount: 1 };\n this.reverseExports.set(hook, exportId);\n this.ensureResolvingExport(exportId);\n return exportId;\n }\n unexport(ids) {\n for (let id of ids) {\n this.releaseExport(id, 1);\n }\n }\n releaseExport(exportId, refcount) {\n let entry = this.exports[exportId];\n if (!entry) {\n throw new Error(`no such export ID: ${exportId}`);\n }\n if (entry.refcount < refcount) {\n throw new Error(`refcount would go negative: ${entry.refcount} < ${refcount}`);\n }\n entry.refcount -= refcount;\n if (entry.refcount === 0) {\n delete this.exports[exportId];\n this.reverseExports.delete(entry.hook);\n entry.hook.dispose();\n }\n }\n onSendError(error) {\n if (this.options.onSendError) {\n return this.options.onSendError(error);\n }\n }\n ensureResolvingExport(exportId) {\n let exp = this.exports[exportId];\n if (!exp) {\n throw new Error(`no such export ID: ${exportId}`);\n }\n if (!exp.pull) {\n let resolve = async () => {\n let hook = exp.hook;\n for (; ; ) {\n let payload = await hook.pull();\n if (payload.value instanceof RpcStub) {\n let { hook: inner, pathIfPromise } = unwrapStubAndPath(payload.value);\n if (pathIfPromise && pathIfPromise.length == 0) {\n if (this.getImport(hook) === void 0) {\n hook = inner;\n continue;\n }\n }\n }\n return payload;\n }\n };\n let autoRelease = exp.autoRelease;\n ++this.pullCount;\n exp.pull = resolve().then(\n (payload) => {\n let value = Devaluator.devaluate(payload.value, void 0, this, payload);\n this.send([\"resolve\", exportId, value]);\n if (autoRelease) this.releaseExport(exportId, 1);\n },\n (error) => {\n this.send([\"reject\", exportId, Devaluator.devaluate(error, void 0, this)]);\n if (autoRelease) this.releaseExport(exportId, 1);\n }\n ).catch(\n (error) => {\n try {\n this.send([\"reject\", exportId, Devaluator.devaluate(error, void 0, this)]);\n if (autoRelease) this.releaseExport(exportId, 1);\n } catch (error2) {\n this.abort(error2);\n }\n }\n ).finally(() => {\n if (--this.pullCount === 0) {\n if (this.onBatchDone) {\n this.onBatchDone.resolve();\n }\n }\n });\n }\n }\n getImport(hook) {\n if (hook instanceof RpcImportHook && hook.entry && hook.entry.session === this) {\n return hook.entry.importId;\n } else {\n return void 0;\n }\n }\n importStub(idx) {\n if (this.abortReason) throw this.abortReason;\n let entry = this.imports[idx];\n if (!entry) {\n entry = new ImportTableEntry(this, idx, false);\n this.imports[idx] = entry;\n }\n return new RpcImportHook(\n /*isPromise=*/\n false,\n entry\n );\n }\n importPromise(idx) {\n if (this.abortReason) throw this.abortReason;\n if (this.imports[idx]) {\n return new ErrorStubHook(new Error(\n \"Bug in RPC system: The peer sent a promise reusing an existing export ID.\"\n ));\n }\n let entry = new ImportTableEntry(this, idx, true);\n this.imports[idx] = entry;\n return new RpcImportHook(\n /*isPromise=*/\n true,\n entry\n );\n }\n getExport(idx) {\n return this.exports[idx]?.hook;\n }\n getPipeReadable(exportId) {\n let entry = this.exports[exportId];\n if (!entry || !entry.pipeReadable) {\n throw new Error(`Export ${exportId} is not a pipe or its readable end was already consumed.`);\n }\n let readable = entry.pipeReadable;\n entry.pipeReadable = void 0;\n return readable;\n }\n createPipe(readable, readableHook) {\n if (this.abortReason) throw this.abortReason;\n this.send([\"pipe\"]);\n let importId = this.imports.length;\n let entry = new ImportTableEntry(this, importId, false);\n this.imports.push(entry);\n let hook = new RpcImportHook(\n /*isPromise=*/\n false,\n entry\n );\n let writable = streamImpl.createWritableStreamFromHook(hook);\n readable.pipeTo(writable).catch(() => {\n }).finally(() => readableHook.dispose());\n return importId;\n }\n // Serializes and sends a message. Returns the byte length of the serialized message.\n send(msg) {\n if (this.abortReason !== void 0) {\n return 0;\n }\n let msgText;\n try {\n msgText = JSON.stringify(msg);\n } catch (err) {\n try {\n this.abort(err);\n } catch (err2) {\n }\n throw err;\n }\n this.transport.send(msgText).catch((err) => this.abort(err, false));\n return msgText.length;\n }\n sendCall(id, path, args) {\n if (this.abortReason) throw this.abortReason;\n let value = [\"pipeline\", id, path];\n if (args) {\n let devalue = Devaluator.devaluate(args.value, void 0, this, args);\n value.push(devalue[0]);\n }\n this.send([\"push\", value]);\n let entry = new ImportTableEntry(this, this.imports.length, false);\n this.imports.push(entry);\n return new RpcImportHook(\n /*isPromise=*/\n true,\n entry\n );\n }\n sendStream(id, path, args) {\n if (this.abortReason) throw this.abortReason;\n let value = [\"pipeline\", id, path];\n let devalue = Devaluator.devaluate(args.value, void 0, this, args);\n value.push(devalue[0]);\n let size = this.send([\"stream\", value]);\n let importId = this.imports.length;\n let entry = new ImportTableEntry(\n this,\n importId,\n /*pulling=*/\n true\n );\n entry.remoteRefcount = 0;\n entry.localRefcount = 1;\n this.imports.push(entry);\n let promise = entry.awaitResolution().then(\n (p) => {\n p.dispose();\n delete this.imports[importId];\n },\n (err) => {\n delete this.imports[importId];\n throw err;\n }\n );\n return { promise, size };\n }\n sendMap(id, path, captures, instructions) {\n if (this.abortReason) {\n for (let cap of captures) {\n cap.dispose();\n }\n throw this.abortReason;\n }\n let devaluedCaptures = captures.map((hook) => {\n let importId = this.getImport(hook);\n if (importId !== void 0) {\n return [\"import\", importId];\n } else {\n return [\"export\", this.exportStub(hook)];\n }\n });\n let value = [\"remap\", id, path, devaluedCaptures, instructions];\n this.send([\"push\", value]);\n let entry = new ImportTableEntry(this, this.imports.length, false);\n this.imports.push(entry);\n return new RpcImportHook(\n /*isPromise=*/\n true,\n entry\n );\n }\n sendPull(id) {\n if (this.abortReason) throw this.abortReason;\n this.send([\"pull\", id]);\n }\n sendRelease(id, remoteRefcount) {\n if (this.abortReason) return;\n this.send([\"release\", id, remoteRefcount]);\n delete this.imports[id];\n }\n abort(error, trySendAbortMessage = true) {\n if (this.abortReason !== void 0) return;\n this.cancelReadLoop(error);\n if (trySendAbortMessage) {\n try {\n this.transport.send(JSON.stringify([\"abort\", Devaluator.devaluate(error, void 0, this)])).catch((err) => {\n });\n } catch (err) {\n }\n }\n if (error === void 0) {\n error = \"undefined\";\n }\n this.abortReason = error;\n if (this.onBatchDone) {\n this.onBatchDone.reject(error);\n }\n if (this.transport.abort) {\n try {\n this.transport.abort(error);\n } catch (err) {\n Promise.resolve(err);\n }\n }\n for (let i in this.onBrokenCallbacks) {\n try {\n this.onBrokenCallbacks[i](error);\n } catch (err) {\n Promise.resolve(err);\n }\n }\n for (let i in this.imports) {\n this.imports[i].abort(error);\n }\n for (let i in this.exports) {\n this.exports[i].hook.dispose();\n }\n }\n async readLoop(abortPromise) {\n while (!this.abortReason) {\n let msg = JSON.parse(await Promise.race([this.transport.receive(), abortPromise]));\n if (this.abortReason) break;\n if (msg instanceof Array) {\n switch (msg[0]) {\n case \"push\":\n if (msg.length > 1) {\n let payload = new Evaluator(this).evaluate(msg[1]);\n let hook = new PayloadStubHook(payload);\n hook.ignoreUnhandledRejections();\n this.exports.push({ hook, refcount: 1 });\n continue;\n }\n break;\n case \"stream\": {\n if (msg.length > 1) {\n let payload = new Evaluator(this).evaluate(msg[1]);\n let hook = new PayloadStubHook(payload);\n hook.ignoreUnhandledRejections();\n let exportId = this.exports.length;\n this.exports.push({ hook, refcount: 1, autoRelease: true });\n this.ensureResolvingExport(exportId);\n continue;\n }\n break;\n }\n case \"pipe\": {\n let { readable, writable } = new TransformStream();\n let hook = streamImpl.createWritableStreamHook(writable);\n this.exports.push({ hook, refcount: 1, pipeReadable: readable });\n continue;\n }\n case \"pull\": {\n let exportId = msg[1];\n if (typeof exportId == \"number\") {\n this.ensureResolvingExport(exportId);\n continue;\n }\n break;\n }\n case \"resolve\":\n // [\"resolve\", ExportId, Expression]\n case \"reject\": {\n let importId = msg[1];\n if (typeof importId == \"number\" && msg.length > 2) {\n let imp = this.imports[importId];\n if (imp) {\n if (msg[0] == \"resolve\") {\n imp.resolve(new PayloadStubHook(new Evaluator(this).evaluate(msg[2])));\n } else {\n let payload = new Evaluator(this).evaluate(msg[2]);\n payload.dispose();\n imp.resolve(new ErrorStubHook(payload.value));\n }\n } else {\n if (msg[0] == \"resolve\") {\n new Evaluator(this).evaluate(msg[2]).dispose();\n }\n }\n continue;\n }\n break;\n }\n case \"release\": {\n let exportId = msg[1];\n let refcount = msg[2];\n if (typeof exportId == \"number\" && typeof refcount == \"number\") {\n this.releaseExport(exportId, refcount);\n continue;\n }\n break;\n }\n case \"abort\": {\n let payload = new Evaluator(this).evaluate(msg[1]);\n payload.dispose();\n this.abort(payload, false);\n break;\n }\n }\n }\n throw new Error(`bad RPC message: ${JSON.stringify(msg)}`);\n }\n }\n async drain() {\n if (this.abortReason) {\n throw this.abortReason;\n }\n if (this.pullCount > 0) {\n let { promise, resolve, reject } = Promise.withResolvers();\n this.onBatchDone = { resolve, reject };\n await promise;\n }\n }\n getStats() {\n let result = { imports: 0, exports: 0 };\n for (let i in this.imports) {\n ++result.imports;\n }\n for (let i in this.exports) {\n ++result.exports;\n }\n return result;\n }\n};\nvar RpcSession = class {\n #session;\n #mainStub;\n constructor(transport, localMain, options = {}) {\n let mainHook;\n if (localMain) {\n mainHook = new PayloadStubHook(RpcPayload.fromAppReturn(localMain));\n } else {\n mainHook = new ErrorStubHook(new Error(\"This connection has no main object.\"));\n }\n this.#session = new RpcSessionImpl(transport, mainHook, options);\n this.#mainStub = new RpcStub(this.#session.getMainImport());\n }\n getRemoteMain() {\n return this.#mainStub;\n }\n getStats() {\n return this.#session.getStats();\n }\n drain() {\n return this.#session.drain();\n }\n};\nfunction newWebSocketRpcSession(webSocket, localMain, options) {\n if (typeof webSocket === \"string\") {\n webSocket = new WebSocket(webSocket);\n }\n let transport = new WebSocketTransport(webSocket);\n let rpc = new RpcSession(transport, localMain, options);\n return rpc.getRemoteMain();\n}\nfunction newWorkersWebSocketRpcResponse(request, localMain, options) {\n if (request.headers.get(\"Upgrade\")?.toLowerCase() !== \"websocket\") {\n return new Response(\"This endpoint only accepts WebSocket requests.\", { status: 400 });\n }\n let pair = new WebSocketPair();\n let server = pair[0];\n server.accept();\n newWebSocketRpcSession(server, localMain, options);\n return new Response(null, {\n status: 101,\n webSocket: pair[1]\n });\n}\nvar WebSocketTransport = class {\n constructor(webSocket) {\n this.#webSocket = webSocket;\n if (webSocket.readyState === WebSocket.CONNECTING) {\n this.#sendQueue = [];\n webSocket.addEventListener(\"open\", (event) => {\n try {\n for (let message of this.#sendQueue) {\n webSocket.send(message);\n }\n } catch (err) {\n this.#receivedError(err);\n }\n this.#sendQueue = void 0;\n });\n }\n webSocket.addEventListener(\"message\", (event) => {\n if (this.#error) ;\n else if (typeof event.data === \"string\") {\n if (this.#receiveResolver) {\n this.#receiveResolver(event.data);\n this.#receiveResolver = void 0;\n this.#receiveRejecter = void 0;\n } else {\n this.#receiveQueue.push(event.data);\n }\n } else {\n this.#receivedError(new TypeError(\"Received non-string message from WebSocket.\"));\n }\n });\n webSocket.addEventListener(\"close\", (event) => {\n this.#receivedError(new Error(`Peer closed WebSocket: ${event.code} ${event.reason}`));\n });\n webSocket.addEventListener(\"error\", (event) => {\n this.#receivedError(new Error(`WebSocket connection failed.`));\n });\n }\n #webSocket;\n #sendQueue;\n // only if not opened yet\n #receiveResolver;\n #receiveRejecter;\n #receiveQueue = [];\n #error;\n async send(message) {\n if (this.#sendQueue === void 0) {\n this.#webSocket.send(message);\n } else {\n this.#sendQueue.push(message);\n }\n }\n async receive() {\n if (this.#receiveQueue.length > 0) {\n return this.#receiveQueue.shift();\n } else if (this.#error) {\n throw this.#error;\n } else {\n return new Promise((resolve, reject) => {\n this.#receiveResolver = resolve;\n this.#receiveRejecter = reject;\n });\n }\n }\n abort(reason) {\n let message;\n if (reason instanceof Error) {\n message = reason.message;\n } else {\n message = `${reason}`;\n }\n this.#webSocket.close(3e3, message);\n if (!this.#error) {\n this.#error = reason;\n }\n }\n #receivedError(reason) {\n if (!this.#error) {\n this.#error = reason;\n if (this.#receiveRejecter) {\n this.#receiveRejecter(reason);\n this.#receiveResolver = void 0;\n this.#receiveRejecter = void 0;\n }\n }\n }\n};\nvar BatchServerTransport = class {\n constructor(batch) {\n this.#batchToReceive = batch;\n }\n #batchToSend = [];\n #batchToReceive;\n #allReceived = Promise.withResolvers();\n async send(message) {\n this.#batchToSend.push(message);\n }\n async receive() {\n let msg = this.#batchToReceive.shift();\n if (msg !== void 0) {\n return msg;\n } else {\n this.#allReceived.resolve();\n return new Promise((r) => {\n });\n }\n }\n abort(reason) {\n this.#allReceived.reject(reason);\n }\n whenAllReceived() {\n return this.#allReceived.promise;\n }\n getResponseBody() {\n return this.#batchToSend.join(\"\\n\");\n }\n};\nasync function newHttpBatchRpcResponse(request, localMain, options) {\n if (request.method !== \"POST\") {\n return new Response(\"This endpoint only accepts POST requests.\", { status: 405 });\n }\n let body = await request.text();\n let batch = body === \"\" ? [] : body.split(\"\\n\");\n let transport = new BatchServerTransport(batch);\n let rpc = new RpcSession(transport, localMain, options);\n await transport.whenAllReceived();\n await rpc.drain();\n return new Response(transport.getResponseBody());\n}\nvar currentMapBuilder;\nvar MapBuilder = class {\n context;\n captureMap = /* @__PURE__ */ new Map();\n instructions = [];\n constructor(subject, path) {\n if (currentMapBuilder) {\n this.context = {\n parent: currentMapBuilder,\n captures: [],\n subject: currentMapBuilder.capture(subject),\n path\n };\n } else {\n this.context = {\n parent: void 0,\n captures: [],\n subject,\n path\n };\n }\n currentMapBuilder = this;\n }\n unregister() {\n currentMapBuilder = this.context.parent;\n }\n makeInput() {\n return new MapVariableHook(this, 0);\n }\n makeOutput(result) {\n let devalued;\n try {\n devalued = Devaluator.devaluate(result.value, void 0, this, result);\n } finally {\n result.dispose();\n }\n this.instructions.push(devalued);\n if (this.context.parent) {\n this.context.parent.instructions.push(\n [\n \"remap\",\n this.context.subject,\n this.context.path,\n this.context.captures.map((cap) => [\"import\", cap]),\n this.instructions\n ]\n );\n return new MapVariableHook(this.context.parent, this.context.parent.instructions.length);\n } else {\n return this.context.subject.map(this.context.path, this.context.captures, this.instructions);\n }\n }\n pushCall(hook, path, params) {\n let devalued = Devaluator.devaluate(params.value, void 0, this, params);\n devalued = devalued[0];\n let subject = this.capture(hook.dup());\n this.instructions.push([\"pipeline\", subject, path, devalued]);\n return new MapVariableHook(this, this.instructions.length);\n }\n pushGet(hook, path) {\n let subject = this.capture(hook.dup());\n this.instructions.push([\"pipeline\", subject, path]);\n return new MapVariableHook(this, this.instructions.length);\n }\n capture(hook) {\n if (hook instanceof MapVariableHook && hook.mapper === this) {\n return hook.idx;\n }\n let result = this.captureMap.get(hook);\n if (result === void 0) {\n if (this.context.parent) {\n let parentIdx = this.context.parent.capture(hook);\n this.context.captures.push(parentIdx);\n } else {\n this.context.captures.push(hook);\n }\n result = -this.context.captures.length;\n this.captureMap.set(hook, result);\n }\n return result;\n }\n // ---------------------------------------------------------------------------\n // implements Exporter\n exportStub(hook) {\n throw new Error(\n \"Can't construct an RpcTarget or RPC callback inside a mapper function. Try creating a new RpcStub outside the callback first, then using it inside the callback.\"\n );\n }\n exportPromise(hook) {\n return this.exportStub(hook);\n }\n getImport(hook) {\n return this.capture(hook);\n }\n unexport(ids) {\n }\n createPipe(readable) {\n throw new Error(\"Cannot send ReadableStream inside a mapper function.\");\n }\n onSendError(error) {\n }\n};\nmapImpl.sendMap = (hook, path, func) => {\n let builder = new MapBuilder(hook, path);\n let result;\n try {\n result = RpcPayload.fromAppReturn(withCallInterceptor(builder.pushCall.bind(builder), () => {\n return func(new RpcPromise(builder.makeInput(), []));\n }));\n } finally {\n builder.unregister();\n }\n if (result instanceof Promise) {\n result.catch((err) => {\n });\n throw new Error(\"RPC map() callbacks cannot be async.\");\n }\n return new RpcPromise(builder.makeOutput(result), []);\n};\nfunction throwMapperBuilderUseError() {\n throw new Error(\n \"Attempted to use an abstract placeholder from a mapper function. Please make sure your map function has no side effects.\"\n );\n}\nvar MapVariableHook = class extends StubHook {\n constructor(mapper, idx) {\n super();\n this.mapper = mapper;\n this.idx = idx;\n }\n // We don't have anything we actually need to dispose, so dup() can just return the same hook.\n dup() {\n return this;\n }\n dispose() {\n }\n get(path) {\n if (path.length == 0) {\n return this;\n } else if (currentMapBuilder) {\n return currentMapBuilder.pushGet(this, path);\n } else {\n throwMapperBuilderUseError();\n }\n }\n // Other methods should never be called.\n call(path, args) {\n throwMapperBuilderUseError();\n }\n map(path, captures, instructions) {\n throwMapperBuilderUseError();\n }\n pull() {\n throwMapperBuilderUseError();\n }\n ignoreUnhandledRejections() {\n }\n onBroken(callback) {\n throwMapperBuilderUseError();\n }\n};\nvar MapApplicator = class {\n constructor(captures, input) {\n this.captures = captures;\n this.variables = [input];\n }\n variables;\n dispose() {\n for (let variable of this.variables) {\n variable.dispose();\n }\n }\n apply(instructions) {\n try {\n if (instructions.length < 1) {\n throw new Error(\"Invalid empty mapper function.\");\n }\n for (let instruction of instructions.slice(0, -1)) {\n let payload = new Evaluator(this).evaluateCopy(instruction);\n if (payload.value instanceof RpcStub) {\n let hook = unwrapStubNoProperties(payload.value);\n if (hook) {\n this.variables.push(hook);\n continue;\n }\n }\n this.variables.push(new PayloadStubHook(payload));\n }\n return new Evaluator(this).evaluateCopy(instructions[instructions.length - 1]);\n } finally {\n for (let variable of this.variables) {\n variable.dispose();\n }\n }\n }\n importStub(idx) {\n throw new Error(\"A mapper function cannot refer to exports.\");\n }\n importPromise(idx) {\n return this.importStub(idx);\n }\n getExport(idx) {\n if (idx < 0) {\n return this.captures[-idx - 1];\n } else {\n return this.variables[idx];\n }\n }\n getPipeReadable(exportId) {\n throw new Error(\"A mapper function cannot use pipe readables.\");\n }\n};\nfunction applyMapToElement(input, parent, owner, captures, instructions) {\n let inputHook = new PayloadStubHook(RpcPayload.deepCopyFrom(input, parent, owner));\n let mapper = new MapApplicator(captures, inputHook);\n try {\n return mapper.apply(instructions);\n } finally {\n mapper.dispose();\n }\n}\nmapImpl.applyMap = (input, parent, owner, captures, instructions) => {\n try {\n let result;\n if (input instanceof RpcPromise) {\n throw new Error(\"applyMap() can't be called on RpcPromise\");\n } else if (input instanceof Array) {\n let payloads = [];\n try {\n for (let elem of input) {\n payloads.push(applyMapToElement(elem, input, owner, captures, instructions));\n }\n } catch (err) {\n for (let payload of payloads) {\n payload.dispose();\n }\n throw err;\n }\n result = RpcPayload.fromArray(payloads);\n } else if (input === null || input === void 0) {\n result = RpcPayload.fromAppReturn(input);\n } else {\n result = applyMapToElement(input, parent, owner, captures, instructions);\n }\n return new PayloadStubHook(result);\n } finally {\n for (let cap of captures) {\n cap.dispose();\n }\n }\n};\nvar WritableStreamStubHook = class _WritableStreamStubHook extends StubHook {\n state;\n // undefined when disposed\n // Creates a new WritableStreamStubHook that is not duplicated from an existing hook.\n static create(stream) {\n let writer = stream.getWriter();\n return new _WritableStreamStubHook({ refcount: 1, writer, closed: false });\n }\n constructor(state, dupFrom) {\n super();\n this.state = state;\n if (dupFrom) {\n ++state.refcount;\n }\n }\n getState() {\n if (this.state) {\n return this.state;\n } else {\n throw new Error(\"Attempted to use a WritableStreamStubHook after it was disposed.\");\n }\n }\n call(path, args) {\n try {\n let state = this.getState();\n if (path.length !== 1 || typeof path[0] !== \"string\") {\n throw new Error(\"WritableStream stub only supports direct method calls\");\n }\n const method = path[0];\n if (method !== \"write\" && method !== \"close\" && method !== \"abort\") {\n args.dispose();\n throw new Error(`Unknown WritableStream method: ${method}`);\n }\n if (method === \"close\" || method === \"abort\") {\n state.closed = true;\n }\n let func = state.writer[method];\n let promise = args.deliverCall(func, state.writer);\n return new PromiseStubHook(promise.then((payload) => new PayloadStubHook(payload)));\n } catch (err) {\n return new ErrorStubHook(err);\n }\n }\n map(path, captures, instructions) {\n for (let cap of captures) {\n cap.dispose();\n }\n return new ErrorStubHook(new Error(\"Cannot use map() on a WritableStream\"));\n }\n get(path) {\n return new ErrorStubHook(new Error(\"Cannot access properties on a WritableStream stub\"));\n }\n dup() {\n let state = this.getState();\n return new _WritableStreamStubHook(state, this);\n }\n pull() {\n return Promise.reject(new Error(\"Cannot pull a WritableStream stub\"));\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n let state = this.state;\n this.state = void 0;\n if (state) {\n if (--state.refcount === 0) {\n if (!state.closed) {\n state.writer.abort(new Error(\"WritableStream RPC stub was disposed without calling close()\")).catch(() => {\n });\n }\n state.writer.releaseLock();\n }\n }\n }\n onBroken(callback) {\n }\n};\nvar INITIAL_WINDOW = 256 * 1024;\nvar MAX_WINDOW = 1024 * 1024 * 1024;\nvar MIN_WINDOW = 64 * 1024;\nvar STARTUP_GROWTH_FACTOR = 2;\nvar STEADY_GROWTH_FACTOR = 1.25;\nvar DECAY_FACTOR = 0.9;\nvar STARTUP_EXIT_ROUNDS = 3;\nvar FlowController = class {\n constructor(now) {\n this.now = now;\n }\n // The current window size in bytes. The sender blocks when bytesInFlight >= window.\n window = INITIAL_WINDOW;\n // Total bytes currently in flight (sent but not yet acked).\n bytesInFlight = 0;\n // Whether we're still in the startup phase.\n inStartupPhase = true;\n // ----- BDP estimation state (private) -----\n // Total bytes acked so far.\n delivered = 0;\n // Time of most recent ack.\n deliveredTime = 0;\n // Time when the very first ack was received.\n firstAckTime = 0;\n firstAckDelivered = 0;\n // Global minimum RTT observed (milliseconds).\n minRtt = Infinity;\n // For startup exit: count of consecutive RTT rounds where the window didn't meaningfully grow.\n roundsWithoutIncrease = 0;\n // Window size at the start of the current round, for startup exit detection.\n lastRoundWindow = 0;\n // Time when the current round started.\n roundStartTime = 0;\n // Called when a write of `size` bytes is about to be sent. Returns a token that must be\n // passed to onAck() when the ack arrives, and whether the sender should block (window full).\n onSend(size) {\n this.bytesInFlight += size;\n let token = {\n sentTime: this.now(),\n size,\n deliveredAtSend: this.delivered,\n deliveredTimeAtSend: this.deliveredTime,\n windowAtSend: this.window,\n windowFullAtSend: this.bytesInFlight >= this.window\n };\n return { token, shouldBlock: token.windowFullAtSend };\n }\n // Called when a previously-sent write fails. Restores bytesInFlight without updating\n // any BDP estimates.\n onError(token) {\n this.bytesInFlight -= token.size;\n }\n // Called when an ack is received for a previously-sent write. Updates BDP estimates and\n // the window. Returns whether a blocked sender should now unblock.\n onAck(token) {\n let ackTime = this.now();\n this.delivered += token.size;\n this.deliveredTime = ackTime;\n this.bytesInFlight -= token.size;\n let rtt = ackTime - token.sentTime;\n this.minRtt = Math.min(this.minRtt, rtt);\n if (this.firstAckTime === 0) {\n this.firstAckTime = ackTime;\n this.firstAckDelivered = this.delivered;\n } else {\n let baseTime;\n let baseDelivered;\n if (token.deliveredTimeAtSend === 0) {\n baseTime = this.firstAckTime;\n baseDelivered = this.firstAckDelivered;\n } else {\n baseTime = token.deliveredTimeAtSend;\n baseDelivered = token.deliveredAtSend;\n }\n let interval = ackTime - baseTime;\n let bytes = this.delivered - baseDelivered;\n let bandwidth = bytes / interval;\n let growthFactor = this.inStartupPhase ? STARTUP_GROWTH_FACTOR : STEADY_GROWTH_FACTOR;\n let newWindow = bandwidth * this.minRtt * growthFactor;\n newWindow = Math.min(newWindow, token.windowAtSend * growthFactor);\n if (token.windowFullAtSend) {\n newWindow = Math.max(newWindow, token.windowAtSend * DECAY_FACTOR);\n } else {\n newWindow = Math.max(newWindow, this.window);\n }\n this.window = Math.max(Math.min(newWindow, MAX_WINDOW), MIN_WINDOW);\n if (this.inStartupPhase && token.sentTime >= this.roundStartTime) {\n if (this.window > this.lastRoundWindow * STEADY_GROWTH_FACTOR) {\n this.roundsWithoutIncrease = 0;\n } else {\n if (++this.roundsWithoutIncrease >= STARTUP_EXIT_ROUNDS) {\n this.inStartupPhase = false;\n }\n }\n this.roundStartTime = ackTime;\n this.lastRoundWindow = this.window;\n }\n }\n return this.bytesInFlight < this.window;\n }\n};\nfunction createWritableStreamFromHook(hook) {\n let pendingError = void 0;\n let hookDisposed = false;\n let fc = new FlowController(() => performance.now());\n let windowResolve;\n let windowReject;\n const disposeHook = () => {\n if (!hookDisposed) {\n hookDisposed = true;\n hook.dispose();\n }\n };\n return new WritableStream({\n write(chunk, controller) {\n if (pendingError !== void 0) {\n throw pendingError;\n }\n const payload = RpcPayload.fromAppParams([chunk]);\n const { promise, size } = hook.stream([\"write\"], payload);\n if (size === void 0) {\n return promise.catch((err) => {\n if (pendingError === void 0) {\n pendingError = err;\n }\n throw err;\n });\n } else {\n let { token, shouldBlock } = fc.onSend(size);\n promise.then(() => {\n let hasCapacity = fc.onAck(token);\n if (hasCapacity && windowResolve) {\n windowResolve();\n windowResolve = void 0;\n windowReject = void 0;\n }\n }, (err) => {\n fc.onError(token);\n if (pendingError === void 0) {\n pendingError = err;\n controller.error(err);\n disposeHook();\n }\n if (windowReject) {\n windowReject(err);\n windowResolve = void 0;\n windowReject = void 0;\n }\n });\n if (shouldBlock) {\n return new Promise((resolve, reject) => {\n windowResolve = resolve;\n windowReject = reject;\n });\n }\n }\n },\n async close() {\n if (pendingError !== void 0) {\n disposeHook();\n throw pendingError;\n }\n const { promise } = hook.stream([\"close\"], RpcPayload.fromAppParams([]));\n try {\n await promise;\n } catch (err) {\n throw pendingError ?? err;\n } finally {\n disposeHook();\n }\n },\n abort(reason) {\n if (pendingError !== void 0) {\n return;\n }\n pendingError = reason ?? new Error(\"WritableStream was aborted\");\n if (windowReject) {\n windowReject(pendingError);\n windowResolve = void 0;\n windowReject = void 0;\n }\n const { promise } = hook.stream([\"abort\"], RpcPayload.fromAppParams([reason]));\n promise.then(() => disposeHook(), () => disposeHook());\n }\n });\n}\nvar ReadableStreamStubHook = class _ReadableStreamStubHook extends StubHook {\n state;\n // undefined when disposed\n // Creates a new ReadableStreamStubHook.\n static create(stream) {\n return new _ReadableStreamStubHook({ refcount: 1, stream, canceled: false });\n }\n constructor(state, dupFrom) {\n super();\n this.state = state;\n if (dupFrom) {\n ++state.refcount;\n }\n }\n call(path, args) {\n args.dispose();\n return new ErrorStubHook(new Error(\"Cannot call methods on a ReadableStream stub\"));\n }\n map(path, captures, instructions) {\n for (let cap of captures) {\n cap.dispose();\n }\n return new ErrorStubHook(new Error(\"Cannot use map() on a ReadableStream\"));\n }\n get(path) {\n return new ErrorStubHook(new Error(\"Cannot access properties on a ReadableStream stub\"));\n }\n dup() {\n let state = this.state;\n if (!state) {\n throw new Error(\"Attempted to dup a ReadableStreamStubHook after it was disposed.\");\n }\n return new _ReadableStreamStubHook(state, this);\n }\n pull() {\n return Promise.reject(new Error(\"Cannot pull a ReadableStream stub\"));\n }\n ignoreUnhandledRejections() {\n }\n dispose() {\n let state = this.state;\n this.state = void 0;\n if (state) {\n if (--state.refcount === 0) {\n if (!state.canceled) {\n state.canceled = true;\n if (!state.stream.locked) {\n state.stream.cancel(\n new Error(\"ReadableStream RPC stub was disposed without being consumed\")\n ).catch(() => {\n });\n }\n }\n }\n }\n }\n onBroken(callback) {\n }\n};\nstreamImpl.createWritableStreamHook = WritableStreamStubHook.create;\nstreamImpl.createWritableStreamFromHook = createWritableStreamFromHook;\nstreamImpl.createReadableStreamHook = ReadableStreamStubHook.create;\nasync function newWorkersRpcResponse(request, localMain) {\n if (request.method === \"POST\") {\n let response = await newHttpBatchRpcResponse(request, localMain);\n response.headers.set(\"Access-Control-Allow-Origin\", \"*\");\n return response;\n } else if (request.headers.get(\"Upgrade\")?.toLowerCase() === \"websocket\") {\n return newWorkersWebSocketRpcResponse(request, localMain);\n } else {\n return new Response(\"This endpoint only accepts POST or WebSocket requests.\", { status: 400 });\n }\n}\n\n// templates/remoteBindings/ProxyServerWorker.ts\nimport { EmailMessage } from \"cloudflare:email\";\nvar BindingNotFoundError = class extends Error {\n constructor(name) {\n super(`Binding ${name ? `\"${name}\"` : \"\"} not found`);\n }\n};\nfunction getExposedJSRPCBinding(request, env) {\n const url = new URL(request.url);\n const bindingName = url.searchParams.get(\"MF-Binding\");\n if (!bindingName) {\n throw new BindingNotFoundError();\n }\n const targetBinding = env[bindingName];\n if (!targetBinding) {\n throw new BindingNotFoundError(bindingName);\n }\n if (targetBinding.constructor.name === \"SendEmail\") {\n return {\n async send(e) {\n if (\"EmailMessage::raw\" in e) {\n const message = new EmailMessage(\n e.from,\n e.to,\n e[\"EmailMessage::raw\"]\n );\n return targetBinding.send(message);\n } else {\n return targetBinding.send(e);\n }\n }\n };\n }\n if (url.searchParams.has(\"MF-Dispatch-Namespace-Options\")) {\n const { name, args, options } = JSON.parse(\n url.searchParams.get(\"MF-Dispatch-Namespace-Options\")\n );\n return targetBinding.get(name, args, options);\n }\n return targetBinding;\n}\nfunction getExposedFetcher(request, env) {\n const bindingName = request.headers.get(\"MF-Binding\");\n if (!bindingName) {\n throw new BindingNotFoundError();\n }\n const targetBinding = env[bindingName];\n if (!targetBinding) {\n throw new BindingNotFoundError(bindingName);\n }\n const dispatchNamespaceOptions = request.headers.get(\n \"MF-Dispatch-Namespace-Options\"\n );\n if (dispatchNamespaceOptions) {\n const { name, args, options } = JSON.parse(dispatchNamespaceOptions);\n return targetBinding.get(name, args, options);\n }\n return targetBinding;\n}\nfunction isJSRPCBinding(request) {\n const url = new URL(request.url);\n return request.headers.has(\"Upgrade\") && url.searchParams.has(\"MF-Binding\");\n}\nvar ProxyServerWorker_default = {\n async fetch(request, env) {\n try {\n if (isJSRPCBinding(request)) {\n return newWorkersRpcResponse(\n request,\n getExposedJSRPCBinding(request, env)\n );\n } else {\n const fetcher = getExposedFetcher(request, env);\n const originalHeaders = new Headers();\n for (const [name, value] of request.headers) {\n if (name.startsWith(\"mf-header-\")) {\n originalHeaders.set(name.slice(\"mf-header-\".length), value);\n } else if (name === \"upgrade\") {\n originalHeaders.set(name, value);\n }\n }\n return fetcher.fetch(\n request.headers.get(\"MF-URL\") ?? \"http://example.com\",\n new Request(request, {\n redirect: \"manual\",\n headers: originalHeaders\n })\n );\n }\n } catch (e) {\n if (e instanceof BindingNotFoundError) {\n return new Response(e.message, { status: 400 });\n }\n return new Response(e.message, { status: 500 });\n }\n }\n};\nexport {\n ProxyServerWorker_default as default\n};\n", "import type { Middleware } from \"./common\";\n\nconst drainBody: Middleware = async (request, env, _ctx, middlewareCtx) => {\n\ttry {\n\t\treturn await middlewareCtx.next(request, env);\n\t} finally {\n\t\ttry {\n\t\t\tif (request.body !== null && !request.bodyUsed) {\n\t\t\t\tconst reader = request.body.getReader();\n\t\t\t\twhile (!(await reader.read()).done) {}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Failed to drain the unused request body.\", e);\n\t\t}\n\t}\n};\n\nexport default drainBody;\n", "\t\t\t\timport worker, * as OTHER_EXPORTS from \"/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/wrangler-dist/ProxyServerWorker.js\";\n\t\t\t\timport * as __MIDDLEWARE_0__ from \"/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts\";\n\n\t\t\t\texport * from \"/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/wrangler-dist/ProxyServerWorker.js\";\n\t\t\t\tconst MIDDLEWARE_TEST_INJECT = \"__INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__\";\n\t\t\t\texport const __INTERNAL_WRANGLER_MIDDLEWARE__ = [\n\t\t\t\t\t\n\t\t\t\t\t__MIDDLEWARE_0__.default\n\t\t\t\t]\n\t\t\t\texport default worker;", "export type Awaitable = T | Promise;\n// TODO: allow dispatching more events?\nexport type Dispatcher = (\n\ttype: \"scheduled\",\n\tinit: { cron?: string }\n) => Awaitable;\n\nexport type IncomingRequest = Request<\n\tunknown,\n\tIncomingRequestCfProperties\n>;\n\nexport interface MiddlewareContext {\n\tdispatch: Dispatcher;\n\tnext(request: IncomingRequest, env: any): Awaitable;\n}\n\nexport type Middleware = (\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tmiddlewareCtx: MiddlewareContext\n) => Awaitable;\n\nconst __facade_middleware__: Middleware[] = [];\n\n// The register functions allow for the insertion of one or many middleware,\n// We register internal middleware first in the stack, but have no way of controlling\n// the order that addMiddleware is run in service workers so need an internal function.\nexport function __facade_register__(...args: (Middleware | Middleware[])[]) {\n\t__facade_middleware__.push(...args.flat());\n}\nexport function __facade_registerInternal__(\n\t...args: (Middleware | Middleware[])[]\n) {\n\t__facade_middleware__.unshift(...args.flat());\n}\n\nfunction __facade_invokeChain__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tmiddlewareChain: Middleware[]\n): Awaitable {\n\tconst [head, ...tail] = middlewareChain;\n\tconst middlewareCtx: MiddlewareContext = {\n\t\tdispatch,\n\t\tnext(newRequest, newEnv) {\n\t\t\treturn __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);\n\t\t},\n\t};\n\treturn head(request, env, ctx, middlewareCtx);\n}\n\nexport function __facade_invoke__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tfinalMiddleware: Middleware\n): Awaitable {\n\treturn __facade_invokeChain__(request, env, ctx, dispatch, [\n\t\t...__facade_middleware__,\n\t\tfinalMiddleware,\n\t]);\n}\n", "// This loads all middlewares exposed on the middleware object and then starts\n// the invocation chain. The big idea is that we can add these to the middleware\n// export dynamically through wrangler, or we can potentially let users directly\n// add them as a sort of \"plugin\" system.\n\nimport ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from \"/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js\";\nimport { __facade_invoke__, __facade_register__, Dispatcher } from \"/home/ghanshyam-singh/Desktop/scholarai/node_modules/wrangler/templates/middleware/common.ts\";\nimport type { WorkerEntrypointConstructor } from \"/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js\";\n\n// Preserve all the exports from the worker\nexport * from \"/home/ghanshyam-singh/Desktop/scholarai/.wrangler/tmp/bundle-lfsPwi/middleware-insertion-facade.js\";\n\nclass __Facade_ScheduledController__ implements ScheduledController {\n\treadonly #noRetry: ScheduledController[\"noRetry\"];\n\n\tconstructor(\n\t\treadonly scheduledTime: number,\n\t\treadonly cron: string,\n\t\tnoRetry: ScheduledController[\"noRetry\"]\n\t) {\n\t\tthis.#noRetry = noRetry;\n\t}\n\n\tnoRetry() {\n\t\tif (!(this instanceof __Facade_ScheduledController__)) {\n\t\t\tthrow new TypeError(\"Illegal invocation\");\n\t\t}\n\t\t// Need to call native method immediately in case uncaught error thrown\n\t\tthis.#noRetry();\n\t}\n}\n\nfunction wrapExportedHandler(worker: ExportedHandler): ExportedHandler {\n\t// If we don't have any middleware defined, just return the handler as is\n\tif (\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0\n\t) {\n\t\treturn worker;\n\t}\n\t// Otherwise, register all middleware once\n\tfor (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {\n\t\t__facade_register__(middleware);\n\t}\n\n\tconst fetchDispatcher: ExportedHandlerFetchHandler = function (\n\t\trequest,\n\t\tenv,\n\t\tctx\n\t) {\n\t\tif (worker.fetch === undefined) {\n\t\t\tthrow new Error(\"Handler does not export a fetch() function.\");\n\t\t}\n\t\treturn worker.fetch(request, env, ctx);\n\t};\n\n\treturn {\n\t\t...worker,\n\t\tfetch(request, env, ctx) {\n\t\t\tconst dispatcher: Dispatcher = function (type, init) {\n\t\t\t\tif (type === \"scheduled\" && worker.scheduled !== undefined) {\n\t\t\t\t\tconst controller = new __Facade_ScheduledController__(\n\t\t\t\t\t\tDate.now(),\n\t\t\t\t\t\tinit.cron ?? \"\",\n\t\t\t\t\t\t() => {}\n\t\t\t\t\t);\n\t\t\t\t\treturn worker.scheduled(controller, env, ctx);\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);\n\t\t},\n\t};\n}\n\nfunction wrapWorkerEntrypoint(\n\tklass: WorkerEntrypointConstructor\n): WorkerEntrypointConstructor {\n\t// If we don't have any middleware defined, just return the handler as is\n\tif (\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0\n\t) {\n\t\treturn klass;\n\t}\n\t// Otherwise, register all middleware once\n\tfor (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {\n\t\t__facade_register__(middleware);\n\t}\n\n\t// `extend`ing `klass` here so other RPC methods remain callable\n\treturn class extends klass {\n\t\t#fetchDispatcher: ExportedHandlerFetchHandler> = (\n\t\t\trequest,\n\t\t\tenv,\n\t\t\tctx\n\t\t) => {\n\t\t\tthis.env = env;\n\t\t\tthis.ctx = ctx;\n\t\t\tif (super.fetch === undefined) {\n\t\t\t\tthrow new Error(\"Entrypoint class does not define a fetch() function.\");\n\t\t\t}\n\t\t\treturn super.fetch(request);\n\t\t};\n\n\t\t#dispatcher: Dispatcher = (type, init) => {\n\t\t\tif (type === \"scheduled\" && super.scheduled !== undefined) {\n\t\t\t\tconst controller = new __Facade_ScheduledController__(\n\t\t\t\t\tDate.now(),\n\t\t\t\t\tinit.cron ?? \"\",\n\t\t\t\t\t() => {}\n\t\t\t\t);\n\t\t\t\treturn super.scheduled(controller);\n\t\t\t}\n\t\t};\n\n\t\tfetch(request: Request) {\n\t\t\treturn __facade_invoke__(\n\t\t\t\trequest,\n\t\t\t\tthis.env,\n\t\t\t\tthis.ctx,\n\t\t\t\tthis.#dispatcher,\n\t\t\t\tthis.#fetchDispatcher\n\t\t\t);\n\t\t}\n\t};\n}\n\nlet WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined;\nif (typeof ENTRY === \"object\") {\n\tWRAPPED_ENTRY = wrapExportedHandler(ENTRY);\n} else if (typeof ENTRY === \"function\") {\n\tWRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY);\n}\nexport default WRAPPED_ENTRY;\n"], - "mappings": "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", - "names": [] -}