UNPKG

5.31 kBJavaScriptView Raw
1var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4 return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5};
6var _HTMLRewriter_elementHandlers, _HTMLRewriter_documentHandlers, _a;
7// FIXME: replace multiple 1 import from skypack!?
8import "./_dnt.polyfills.js";
9import * as _base from './vendor/html_rewriter.js';
10const { default: initWASM } = _base;
11const base = _base;
12import { ResolvablePromise } from '@worker-tools/resolvable-promise';
13const kEnableEsiTags = Symbol("kEnableEsiTags");
14// In case a server doesn't return the proper mime type (e.g. githubusercontent.com)..
15const toWASMResponse = (response) => {
16 var _b;
17 if ((_b = response.headers.get('content-type')) === null || _b === void 0 ? void 0 : _b.startsWith('application/wasm'))
18 return response;
19 const { body, headers: hs, ...props } = response;
20 const headers = new Headers(hs);
21 headers.set('content-type', 'application/wasm');
22 return new Response(body, { ...props, headers });
23};
24const initialized = new ResolvablePromise();
25let executing = false;
26export class HTMLRewriter {
27 constructor() {
28 _HTMLRewriter_elementHandlers.set(this, []);
29 _HTMLRewriter_documentHandlers.set(this, []);
30 Object.defineProperty(this, _a, {
31 enumerable: true,
32 configurable: true,
33 writable: true,
34 value: false
35 });
36 if (!initialized.settled && !executing) {
37 executing = true;
38 fetch(new URL("./vendor/html_rewriter_bg.wasm", import.meta.url).href)
39 .then(r => r.ok ? r : (() => { throw Error('WASM response not ok'); })())
40 .then(toWASMResponse)
41 .then(initWASM)
42 .then(() => initialized.resolve())
43 .catch(err => {
44 executing = false;
45 console.error(err);
46 });
47 }
48 }
49 on(selector, handlers) {
50 __classPrivateFieldGet(this, _HTMLRewriter_elementHandlers, "f").push([selector, handlers]);
51 return this;
52 }
53 onDocument(handlers) {
54 __classPrivateFieldGet(this, _HTMLRewriter_documentHandlers, "f").push(handlers);
55 return this;
56 }
57 transform(response) {
58 const body = response.body;
59 // HTMLRewriter doesn't run the end handler if the body is null, so it's
60 // pointless to setup the transform stream.
61 if (body === null)
62 return new Response(body, response);
63 if (response instanceof Response) {
64 // Make sure we validate chunks are BufferSources and convert them to
65 // Uint8Arrays as required by the Rust glue code.
66 response = new Response(response.body, response);
67 }
68 let rewriter;
69 const transformStream = new TransformStream({
70 start: async (controller) => {
71 // Create a rewriter instance for this transformation that writes its
72 // output to the transformed response's stream. Note that each
73 // BaseHTMLRewriter can only be used once.
74 await initialized;
75 rewriter = new base.HTMLRewriter((output) => {
76 // enqueue will throw on empty chunks
77 if (output.length !== 0)
78 controller.enqueue(output);
79 }, { enableEsiTags: this[kEnableEsiTags] });
80 // Add all registered handlers
81 for (const [selector, handlers] of __classPrivateFieldGet(this, _HTMLRewriter_elementHandlers, "f")) {
82 rewriter.on(selector, handlers);
83 }
84 for (const handlers of __classPrivateFieldGet(this, _HTMLRewriter_documentHandlers, "f")) {
85 rewriter.onDocument(handlers);
86 }
87 },
88 // The finally() below will ensure the rewriter is always freed.
89 // chunk is guaranteed to be a Uint8Array as we're using the
90 // @miniflare/core Response class, which transforms to a byte stream.
91 transform: (chunk) => rewriter.write(chunk),
92 flush: () => rewriter.end(),
93 });
94 const promise = body.pipeTo(transformStream.writable);
95 promise.catch(() => { }).finally(() => rewriter === null || rewriter === void 0 ? void 0 : rewriter.free());
96 // Return a response with the transformed body, copying over headers, etc
97 const res = new Response(transformStream.readable, response);
98 // If Content-Length is set, it's probably going to be wrong, since we're
99 // rewriting content, so remove it
100 res.headers.delete("Content-Length");
101 return res;
102 }
103}
104_HTMLRewriter_elementHandlers = new WeakMap(), _HTMLRewriter_documentHandlers = new WeakMap(), _a = kEnableEsiTags;
105export function withEnableEsiTags(rewriter) {
106 rewriter[kEnableEsiTags] = true;
107 return rewriter;
108}
109//# sourceMappingURL=index.js.map
\No newline at end of file