diff options
author | 2022-06-07 22:32:46 -0700 | |
---|---|---|
committer | 2022-06-07 22:32:46 -0700 | |
commit | 43de33afc7fcc4cab25f578566e225ba9e4d4258 (patch) | |
tree | 141676095981741c3a5740093fee79ed12d4edcd /bench/snippets/escapeHTML.js | |
parent | 958fc3d4f5ba2a1fb5b5e1e2b9fe3a4500dbefc6 (diff) | |
download | bun-43de33afc7fcc4cab25f578566e225ba9e4d4258.tar.gz bun-43de33afc7fcc4cab25f578566e225ba9e4d4258.tar.zst bun-43de33afc7fcc4cab25f578566e225ba9e4d4258.zip |
Web Streams API (#176)
* [bun.js] `WritableStream`, `ReadableStream`, `TransformStream`, `WritableStreamDefaultController`, `ReadableStreamDefaultController` & more
* Implement `Blob.stream()`
* Update streams.test.js
* Fix sourcemaps crash
* [TextEncoder] 3x faster in hot loops
* reading almost works
* start to implement native streams
* Implement `Blob.stream()`
* Implement `Bun.file(pathOrFd).stream()`
* Add an extra function
* [fs.readFile] Improve performance
* make jsc bindings a little easier to work with
* fix segfault
* faster async/await + readablestream optimizations
* WebKit updates
* More WebKit updates
* Add releaseWEakrefs binding
* `bun:jsc`
* More streams
* Update streams.test.js
* Update Makefile
* Update mimalloc
* Update WebKit
* Create bun-jsc.test.js
* Faster ReadableStream
* Fix off by one & exceptions
* Handle empty files/blobs
* Update streams.test.js
* Move streams to it's own file
* temp
* impl #1
* take two
* good enough for now
* Implement `readableStreamToArray`, `readableStreamToArrayBuffer`, `concatArrayBuffers`
* jsxOptimizationInlining
* Fix crash
* Add `jsxOptimizationInline` to Bun.Transpiler
* Update Transpiler types
* Update js_ast.zig
* Automatically choose production mode when NODE_ENV="production"
* Update cli.zig
* [jsx] Handle defaultProps when inlining
* Update transpiler.test.js
* uncomment some tests
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'bench/snippets/escapeHTML.js')
-rw-r--r-- | bench/snippets/escapeHTML.js | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/bench/snippets/escapeHTML.js b/bench/snippets/escapeHTML.js new file mode 100644 index 000000000..f186b1d2f --- /dev/null +++ b/bench/snippets/escapeHTML.js @@ -0,0 +1,122 @@ +import { group } from "mitata"; +import { bench, run } from "mitata"; +import { encode as htmlEntityEncode } from "html-entities"; +import { escape as heEscape } from "he"; + +var bunEscapeHTML = globalThis.escapeHTML || Bun.escapeHTML; + +const FIXTURE = require("fs") + .readFileSync(import.meta.dir + "/_fixture.txt", "utf8") + .split("") + .map((a) => { + if (a.charCodeAt(0) > 127) { + return "a"; + } + return a; + }) + .join(""); + +const FIXTURE_WITH_UNICODE = require("fs").readFileSync( + import.meta.dir + "/_fixture.txt", + "utf8" +); + +// from react-dom: +const matchHtmlRegExp = /["'&<>]/; + +function reactEscapeHtml(string) { + const str = "" + string; + const match = matchHtmlRegExp.exec(str); + + if (!match) { + return str; + } + + let escape; + let html = ""; + let index; + let lastIndex = 0; + + for (index = match.index; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: // " + escape = """; + break; + case 38: // & + escape = "&"; + break; + case 39: // ' + escape = "'"; // modified from escape-html; used to be ''' + break; + case 60: // < + escape = "<"; + break; + case 62: // > + escape = ">"; + break; + default: + continue; + } + + if (lastIndex !== index) { + html += str.substring(lastIndex, index); + } + + lastIndex = index + 1; + html += escape; + } + + return lastIndex !== index ? html + str.substring(lastIndex, index) : html; +} + +// for (let input of [ +// "<script>alert('xss')</script>", +// `long string, nothing to escape... `.repeat(9999), +// `long utf16 string, no esc 🤔🤔🤔🤔🤔` + "tex".repeat(4000), +// `smol`, +// // `medium string with <script>alert('xss')</script>`, + +// FIXTURE, +// // "[unicode]" + FIXTURE_WITH_UNICODE, +// ]) { +// group( +// { +// summary: true, +// name: +// `"` + +// input.substring(0, Math.min(input.length, 32)) + +// `"` + +// ` (${input.length} chars)`, +// }, +// () => { +// bench(`ReactDOM.escapeHTML`, () => reactEscapeHtml(input)); +// bench(`html-entities.encode`, () => htmlEntityEncode(input)); +// bench(`he.escape`, () => heEscape(input)); +// bench(`Bun.escapeHTML`, () => bunEscapeHTML(input)); +// } +// ); +// } + +for (let input of [ + `long string, nothing to escape... `.repeat(9999999 * 3), + FIXTURE.repeat(8000), + // "[unicode]" + FIXTURE_WITH_UNICODE, +]) { + group( + { + summary: true, + name: + `"` + + input.substring(0, Math.min(input.length, 32)) + + `"` + + ` (${new Intl.NumberFormat().format(input.length / 100_000_000_0)} GB)`, + }, + () => { + // bench(`ReactDOM.escapeHTML`, () => reactEscapeHtml(input)); + // bench(`html-entities.encode`, () => htmlEntityEncode(input)); + // bench(`he.escape`, () => heEscape(input)); + bench(`Bun.escapeHTML`, () => bunEscapeHTML(input)); + } + ); +} +await run(); |