import { describe, it, expect } from "bun:test"; import { unsafe, spawn, readableStreamToText } from "bun"; import { bunExe, bunEnv, gc } from "harness"; const TEST_WEBSOCKET_HOST = process.env.TEST_WEBSOCKET_HOST || "wss://ws.postman-echo.com/raw"; describe("WebSocket", () => { it("should connect", async () => { const ws = new WebSocket(TEST_WEBSOCKET_HOST); await new Promise((resolve, reject) => { ws.onopen = resolve; ws.onerror = reject; }); var closed = new Promise((resolve, reject) => { ws.onclose = resolve; }); ws.close(); await closed; }); it("should connect over https", async () => { const ws = new WebSocket(TEST_WEBSOCKET_HOST.replaceAll("wss:", "https:")); await new Promise((resolve, reject) => { ws.onopen = resolve; ws.onerror = reject; }); var closed = new Promise((resolve, reject) => { ws.onclose = resolve; }); ws.close(); await closed; }); it("supports headers", done => { const server = Bun.serve({ port: 0, fetch(req, server) { expect(req.headers.get("X-Hello")).toBe("World"); expect(req.headers.get("content-type")).toBe("lolwut"); server.stop(); done(); return new Response(); }, websocket: { open(ws) { ws.close(); }, }, }); const ws = new WebSocket(`ws://${server.hostname}:${server.port}`, { headers: { "X-Hello": "World", "content-type": "lolwut", }, }); }); it("should connect over http", done => { const server = Bun.serve({ port: 0, fetch(req, server) { server.stop(); done(); return new Response(); }, websocket: { open(ws) { ws.close(); }, }, }); const ws = new WebSocket(`http://${server.hostname}:${server.port}`, {}); }); describe("nodebuffer", () => { it("should support 'nodebuffer' binaryType", done => { const server = Bun.serve({ port: 0, fetch(req, server) { if (server.upgrade(req)) { return; } return new Response(); }, websocket: { open(ws) { ws.sendBinary(new Uint8Array([1, 2, 3])); }, }, }); const ws = new WebSocket(`http://${server.hostname}:${server.port}`, {}); ws.binaryType = "nodebuffer"; expect(ws.binaryType).toBe("nodebuffer"); Bun.gc(true); ws.onmessage = ({ data }) => { expect(Buffer.isBuffer(data)).toBe(true); expect(data).toEqual(new Uint8Array([1, 2, 3])); server.stop(true); Bun.gc(true); done(); }; }); it("should support 'nodebuffer' binaryType when the handler is not immediately provided", done => { var client; const server = Bun.serve({ port: 0, fetch(req, server) { if (server.upgrade(req)) { return; } return new Response(); }, websocket: { open(ws) { ws.sendBinary(new Uint8Array([1, 2, 3])); setTimeout(() => { client.onmessage = ({ data }) => { expect(Buffer.isBuffer(data)).toBe(true); expect(data).toEqual(new Uint8Array([1, 2, 3])); server.stop(true); done(); }; }, 0); }, }, }); client = new WebSocket(`http://${server.hostname}:${server.port}`, {}); client.binaryType = "nodebuffer"; expect(client.binaryType).toBe("nodebuffer"); }); }); it("should send and receive messages", async () => { const ws = new WebSocket(TEST_WEBSOCKET_HOST); await new Promise((resolve, reject) => { ws.onopen = resolve; ws.onerror = reject; ws.onclose = () => { reject("WebSocket closed"); }; }); const count = 10; // 10 messages in burst var promise = new Promise((resolve, reject) => { var remain = count; ws.onmessage = event => { gc(true); expect(event.data).toBe("Hello World!"); remain--; if (remain <= 0) { ws.onmessage = () => {}; resolve(); } }; ws.onerror = reject; }); for (let i = 0; i < count; i++) { ws.send("Hello World!"); gc(true); } await promise; var echo = 0; // 10 messages one at a time function waitForEcho() { return new Promise((resolve, reject) => { gc(true); const msg = `Hello World! ${echo++}`; ws.onmessage = event => { expect(event.data).toBe(msg); resolve(); }; ws.onerror = reject; ws.onclose = reject; ws.send(msg); gc(true); }); } gc(true); for (let i = 0; i < count; i++) await waitForEcho(); ws.onclose = () => {}; ws.onerror = () => {}; ws.close(); gc(true); }); }); describe("websocket in subprocess", () => { it("should exit", async () => { let messageReceived = false; const server = Bun.serve({ port: 0, fetch(req, server) { if (server.upgrade(req)) { return; } return new Response("http response"); }, websocket: { open(ws) { ws.send("hello websocket"); }, message(ws) { messageReceived = true; ws.close(); }, close(ws) {}, }, }); const subprocess = Bun.spawn({ cmd: [bunExe(), import.meta.dir + "/websocket-subprocess.ts", `http://${server.hostname}:${server.port}`], stderr: "pipe", stdin: "pipe", stdout: "pipe", env: bunEnv, }); expect(await subprocess.exited).toBe(0); expect(messageReceived).toBe(true); server.stop(true); }); it("should exit after killed", async () => { const subprocess = Bun.spawn({ cmd: [bunExe(), import.meta.dir + "/websocket-subprocess.ts", TEST_WEBSOCKET_HOST], stderr: "pipe", stdin: "pipe", stdout: "pipe", env: bunEnv, }); subprocess.kill(); expect(await subprocess.exited).toBe("SIGHUP"); }); it("should exit with invalid url", async () => { const subprocess = Bun.spawn({ cmd: [bunExe(), import.meta.dir + "/websocket-subprocess.ts", "invalid url"], stderr: "pipe", stdin: "pipe", stdout: "pipe", env: bunEnv, }); expect(await subprocess.exited).toBe(1); }); it("should exit after timeout", async () => { let messageReceived = false; let start = 0; const server = Bun.serve({ port: 0, fetch(req, server) { if (server.upgrade(req)) { return; } return new Response("http response"); }, websocket: { open(ws) { start = performance.now(); ws.send("timeout"); }, message(ws, message) { messageReceived = true; expect(performance.now() - start >= 300).toBe(true); ws.close(); }, close(ws) {}, }, }); const subprocess = Bun.spawn({ cmd: [bunExe(), import.meta.dir + "/websocket-subprocess.ts", `http://${server.hostname}:${server.port}`], stderr: "pipe", stdin: "pipe", stdout: "pipe", env: bunEnv, }); expect(await subprocess.exited).toBe(0); expect(messageReceived).toBe(true); server.stop(true); }); it("should exit after server stop and 0 messages", async () => { const server = Bun.serve({ port: 0, fetch(req, server) { if (server.upgrade(req)) { return; } return new Response("http response"); }, websocket: { open(ws) {}, message(ws, message) {}, close(ws) {}, }, }); const subprocess = Bun.spawn({ cmd: [bunExe(), import.meta.dir + "/websocket-subprocess.ts", `http://${server.hostname}:${server.port}`], stderr: "pipe", stdin: "pipe", stdout: "pipe", env: bunEnv, }); server.stop(true); expect(await subprocess.exited).toBe(0); }); }); eat/incremental-build Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
path: root/examples/with-markdown-plugins (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2022-02-07improve debug logs (#2537)Gravatar Fred K. Schott 3-4/+19
2022-02-07[ci] collect statsGravatar FredKSchott 1-0/+1
2022-02-06[ci] update lockfile (#2527)Gravatar Fred K. Schott 1-208/+238
2022-02-06[ci] collect statsGravatar FredKSchott 1-0/+1
2022-02-05[ci] collect statsGravatar FredKSchott 1-0/+1
2022-02-04[ci] yarn formatGravatar natemoo-re 1-2/+3
2022-02-04fix: HTML/SVG boolean attributes (#2538)Gravatar Nate Moore 2-3/+21
2022-02-04[ci] yarn formatGravatar matthewp 1-4/+2
2022-02-04fix: import local plugins into markdown (#2534)Gravatar Juan Martín Seery 9-22/+41
2022-02-04[ci] collect statsGravatar FredKSchott 1-0/+1
2022-02-03Append to list of HMR modules, don't override (#2532)Gravatar Matthew Phillips 2-1/+6
2022-02-03add back dev server host support (#2531)Gravatar Fred K. Schott 2-1/+14
2022-02-03simplify status code regexGravatar Fred K. Schott 2-87/+4
2022-02-03Adding StackUp Digital to the list of sponsors (#2521)Gravatar Astroalex 3-0/+10
2022-02-03[ci] collect statsGravatar FredKSchott 1-0/+1
2022-02-03[ci] yarn formatGravatar FredKSchott 2-3/+85
2022-02-02Handles all http error code file names the same as 404 files. (#2525)Gravatar Zade Viggers 2-4/+7
2022-02-02fix(sitemap): remove debug if sitemap disabled (#2514)Gravatar Mark Pinero 1-2/+2
2022-02-02[ci] update lockfile (#2515)Gravatar Fred K. Schott 1-276/+279
2022-02-02[ci] yarn formatGravatar matthewp 1-8/+8
2022-02-02[ci] release (next) (#2523)astro@0.23.0-next.1Gravatar github-actions[bot] 28-34/+41
2022-02-02[ci] yarn formatGravatar matthewp 2-17/+29
2022-02-02Fix support for scss in static build (#2522)Gravatar Matthew Phillips 6-20/+114
2022-02-02[ci] collect statsGravatar FredKSchott 1-0/+1
2022-02-01[ci] yarn formatGravatar matthewp 2-12/+12
2022-02-01[ci] release (next) (#2492)astro@0.23.0-next.0@astrojs/test-static-build-pkg@0.0.2@astrojs/markdown-remark@0.6.1-next.0Gravatar github-actions[bot] 31-43/+93
2022-02-01[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-31update congratsbot format againGravatar Fred K. Schott 1-1/+1
2022-01-31update congratsbot againGravatar Fred K. Schott 1-1/+1
2022-01-31Remove SVG animation on GitHub/NPM (#2512)Gravatar Nate Moore 1-21/+0
2022-01-31[ci] yarn formatGravatar natemoo-re 2-4/+6
2022-01-31Add Shiki as an alternative to Prism (#2497)Gravatar Juan Martín Seery 26-9/+356
2022-01-31Deprecate unescaped HTML inside of expressions (#2489)Gravatar Nate Moore 9-31/+74