UNPKG

@micro-frame/marko

Version:

A Marko tag for building SSR friendly micro frontends.

82 lines (81 loc) 2.69 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __reExport = (target, module2, desc) => { if (module2 && typeof module2 === "object" || typeof module2 === "function") { for (let key of __getOwnPropNames(module2)) if (!__hasOwnProp.call(target, key) && key !== "default") __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); } return target; }; var __toModule = (module2) => { return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); }; var import_stream = __toModule(require("../../../util/stream")); function readableToAsyncIterator(readable) { const reader = readable.getReader(); const decoder = new TextDecoder(); return { async next() { const { value, done } = await reader.read(); if (done) { return { value: void 0, done }; } return { value: decoder.decode(value), done }; } }; } module.exports = { onCreate() { const ssrEl = document.getElementById(this.id); if (ssrEl) { this.src = ssrEl.dataset.src; } }, onInput(input) { this.streamSource = (0, import_stream.getSource)(input.name); }, onMount() { this.onUpdate(); }, onDestroy() { var _a; (_a = this.controller) == null ? void 0 : _a.abort(); }, async onUpdate() { var _a; if (this.src === this.input.src) return; this.src = this.input.src; this.streamSource.invalidate(this.input.src); (_a = this.controller) == null ? void 0 : _a.abort(); const controller = this.controller = new AbortController(); let err; try { const res = await (this.input.fetch || fetch)(this.input.src, { method: this.input.method, body: JSON.stringify(this.input.body), headers: this.input.headers, cache: this.input.cache, signal: controller.signal }); if (!res.ok) throw new Error(res.statusText); await this.streamSource.run(this.input.parser(readableToAsyncIterator(res.body))); } catch (_err) { err = _err; this.streamSource.close(err); } } };